У меня есть простая команда, которая делает почти, что я хочу. Следующее определит местоположение всех файлов с суффиксом '_compressed.swf' и скопирует каждого в его тот же каталог с '.bak2', добавленным:
найдите '../содержание' - имя '* _ compressed.swf'-print0 | xargs-0-I {} CP {} {} .bak2
Результаты
В:/content/somefile_compressed.swf
:/content/somefile_compressed.swf.bak2
Однако я должен заменить '_compressed.swf' '_content.swf', который я хотел бы использовать, находят, а не рекурсивный флаг на CP для непротиворечивости.
Цель
В:/content/somefile_compressed.swf
:/content/somefile_content.swf
Это решение является, вероятно, самым портативным:
find "../content" -name "*_compressed.swf" -exec sh -c 'cp {} `dirname {}`/`basename {} compressed.swf`content.swf' \;
Существует также известный rename.pl сценарий, который распределяется с Perl и переименовать командой, которая, возможно, сделала это немного легче. Они не доступны на всех дистрибутивах, хотя, эти команды по большей части.
Я уверен, что это все может быть обработано в одной строке. Я добрался действительно близко к одному решению для строки и с некоторой справкой еще ближе, но никаким успехом. Следующие работы:
#!/bin/bash
# Read all file names into an array
FilesArray=($(find "../content" -name "*_compressed.swf"))
# Get length of an array
FilesIndex=${#FilesArray[@]}
# Use for loop read all directory names
for (( i=0; i<${FilesIndex}; i++ ));
do
source="${FilesArray[$i]}"
destination="$(echo "${source}" | sed 's/compressed/content/')"
cp "${source}" "${destination}"
done
exit 0;
Я полагаю, что это должно добиться цели и является разборным к одному лайнеру, если Вы действительно действительно должны ;)
find ../content -name '*_compressed.swf' | while read file
do
cp "$file" "${file/_compressed.swf/_content.swf}"
done
Замена шаблона Bash работает приятно в этих случаях.