Далі йде пряме виправлення вашого підходу:
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
версія має таку ж ефективність, як перший приклад /