4

У меня есть простая команда, которая делает почти то, что я хочу. Следующие файлы найдут все файлы с суффиксом «_compressed.swf» и скопируют каждый в один и тот же каталог с добавленным «.bak2»:

найти '../content' -name '* _compressed.swf' -print0 | xargs -0 -I {} cp {} {} .bak2

Результаты
В: /content/somefile_compressed.swf
Out: /content/somefile_compressed.swf.bak2

Однако мне нужно заменить '_compressed.swf' на '_content.swf', который я хотел бы использовать вместо консистентности рекурсивного флага на cp.

Задача
В: /content/somefile_compressed.swf
Out: /content/somefile_content.swf

3 ответа3

4

Это решение, пожалуй, самое переносимое:

find "../content" -name "*_compressed.swf" -exec sh -c 'cp {} `dirname {}`/`basename {} compressed.swf`content.swf' \;

Есть также известный сценарий rename.pl, который распространяется вместе с Perl, и команда rename, которая могла бы сделать это немного проще. Они доступны не во всех дистрибутивах, но по большей части эти команды.

1

Я уверен, что все это может быть обработано в одну строку. Я очень близко подошел к решению в одну строку и с некоторой помощью еще ближе, но безуспешно. Следующие работы:

#!/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;
0

Я считаю, что это должно сработать и может быть разложено на один вкладыш, если вам действительно это необходимо;)

find ../content -name '*_compressed.swf' | while read file
do
cp "$file" "${file/_compressed.swf/_content.swf}"
done

Подстановка шаблонов Bash хорошо работает в этих случаях.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .