Как я могу использовать sed, чтобы изменить результаты поиска и передать результаты в cp?

В солярисе я хотел бы скопировать все файлы, найденные командой find, по несколько другому пути. Следующий скрипт в основном выполняет cp для каждого найденного файла find. Например:

cp ./content/english/activity1_compressed.swf ./content/spanish/activity1_compressed.swf
cp ./content/english/activity2_compressed.swf ./content/spanish/activity2_compressed.swf
...

#!/bin/bash

# Read all file names into an array
FilesArray=($(find "." -name "*_compressed.swf"))

# Get length of an array
FilesIndex=${#FilesArray[@]}

# Copy each file from english to spanish folder
# Ex: cp ./english/activity_compressed.swf ./spanish/activity_compressed.swf
for (( i=0; i<${FilesIndex}; i++ ));
do
    source="${FilesArray[$i]}"

    # Replace "english" with "spanish" in path  
    destination="$(echo "${source}" | sed 's/english/spanish/')"

    cp "${source}" "${destination}"
done

exit 0;

Кажется, это немного, и мне интересно, как использовать sed in-line с командами find и cp для достижения того же самого. Я бы надеялся на что-то вроде следующего, но, видимо, скобки не являются приемлемым методом изменения порядка операций:

find . -name *_compressed -exec cp {} (echo '{}' | sed 's/english/spanish/')

2 ответа

Есть более простые способы, но для удобства переносимости мы можем использовать немного разветвления и обратной черты:

находить. -name *_compressed -exec sh -c 'cp {} `echo {} | sed 's/english/spanish/'`' \;

Я бы использовал обратную галочку: здесь вы найдете больше информации (обратная связь есть в главе 3.4.5).

В основном, когда вы заключаете команду между обратными галочками, сама команда будет подставлена ​​в его вывод.

Другие вопросы по тегам