Первый упрощенный проход:
отформатированный:
find |
while read -r f
do case $f in
*.???) echo mv "$f" "${f%.???}_bar${f##${f%.???}}" ;;
*) echo mv "$f" "${f}_bar" ;;
esac
done
Волшебный беспорядок "${f%.???}_bar${f##${f%.???}}"
-
${f%.???}
- это имя файла без упрощенно определенного расширения.
${f##${f%.???}}
- это упрощенно определенное расширение, используемое для удаления всего иначе из начала файла, поэтому является (сложно полученным) вышеупомянутым «упрощенно определяемым расширением». :)
Это не должно создавать никаких подоболочек (кроме find
), поэтому оно должно быть очень эффективным.
<Ч />
CAVEAT SCRIPTOR
Существенным недостатком является .???
, который, скорее всего, НЕ будет делать то, что вы хотели, когда он совпадет с именами файлов x.v1.2.3
и переименует его в x.v1_bar.2.3
. Скорее всего, это можно исправить, но, не видя ваших данных, я не хотел неправильно их уточнять.
<Ч />
Тем не менее, можно сжать до одной строки -
find | while read -r f; do case $f in *.???) echo mv "$f" "${f%.???}_bar${f##${f%.???}}" ;; *) echo mv "$f" "${f}_bar";; esac; done
Я активно избегал попыток превратить все эти в находку. Я рекомендую записать все это в файл и сканировать на предмет сумасшествия перед его выполнением. Если все работает, или есть несколько исключений, которые вы можете просто отредактировать вручную, тогда вы можете просто запустить файл.