Следующее является прямым исправлением вашего подхода:
find . -type f -name 'file*' -exec sh -c 'x="{}"; mv "$x" "${x}_renamed"' \;
Тем не менее, это очень дорого, если у вас много подходящих файлов, потому что вы запускаете новую оболочку (которая выполняет a mv
) для каждого соответствия. И если у вас есть забавные символы в любом имени файла, это взорвется. Более эффективный и безопасный подход заключается в следующем:
find . -type f -name 'file*' -print0 | xargs --null -I{} mv {} {}_renamed
Это также имеет преимущество работы со странно названными файлами. Если find
поддерживает это, это может быть уменьшено до
find . -type f -name 'file*' -exec mv {} {}_renamed \;
xargs
Версия полезна , когда не используется {}
, так как в
find .... -print0 | xargs --null rm
Здесь rm
вызывается один раз (или с большим количеством файлов несколько раз), но не для каждого файла.
Я удалил basename
в вас вопрос, потому что это , вероятно , неправильно: вы бы перейти foo/bar/file8
к file8_renamed
не foo/bar/file8_renamed
.
Редактирует (как предложено в комментариях):
- Добавлено сокращено
find
безxargs
- Добавлена наклейка безопасности
x
это бесполезно:find . -type f -name 'file*' -exec mv {} "{}_renamed" \;
xargs
версия имеет ту же эффективность, что и в первом примере /