2

У меня есть следующий вывод команды find для поиска файлов, содержащих имя yyy :

./plonetheme/xxx/yyy-logo.png
./plonetheme/xxx/profiles/default/plonetheme.yyy_various.txt
./plonetheme/xxx/skins/plonetheme_yyy_custom_images
./plonetheme/xxx/skins/plonetheme_yyy_custom_images/CONTENT.txt
./plonetheme/xxx/skins/plonetheme_yyy_custom_templates
./plonetheme/xxx/skins/plonetheme_yyy_custom_templates/CONTENT.txt
./plonetheme/xxx/skins/plonetheme_yyy_custom_templates/main_template.pt
./plonetheme/xxx/skins/plonetheme_yyy_styles
./plonetheme/xxx/skins/plonetheme_yyy_styles/base_properties.props
./plonetheme/xxx/skins/plonetheme_yyy_styles/CONTENT.txt

Как бы я переименовал весь файл, чтобы строка yyy была заменена на zzz?

2 ответа2

6

Вы можете использовать манипуляции со строками bash для достижения желаемого:

find PATH/PATTERN -exec bash -c 'mv "$0" "${0/yyy/zzz}"' {} \;

-exec выполняет команду до сбежавшего ; где {} - это путь к файлу, который в данный момент обрабатывается.

bash -c 'mv "$0" "${0/cix/stix}"' {} передает этот путь в качестве аргумента bash, который перемещает $0 (первый аргумент, например ./plonetheme/xxx/yyy-logo.png) до ${0/yyy/zzz} (первый управляемый аргумент, например, ./plonetheme/xxx/zzz-logo.png).

2

Как описано здесь, вы можете использовать -print0 и read -r -d'':

find /path/to/files -type f -print0 | while IFS= read -r -d '' file; do
    mv "$file" "${file/yyy/zzz}"
done

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