Вы можете направить вывод команды find
в цикл while read
. Таким образом, даже имена файлов с пробелами будут прочитаны правильно. Не используйте for file in $(find ...)
конструкцию. Это очень неэффективно (поиск должен завершиться до запуска цикла for, у него будут проблемы с файлами с пробелами в имени, и он может перегрузить буфер командной строки, что произойдет без малейшего указания.
Вы также можете использовать конструкцию $[var%name}
. %
означает маленький правый фильтр. Он фильтрует правую часть переменной окружения с помощью соответствующего глобуса. Одно %
означает соответствие наименьшей возможной суммы. Двойное %%
означает совпадение с наибольшей суммой. #
и ##
для левой стороны строки.
Также будьте осторожны, используя кавычки вокруг имен файлов, в том числе пробелы в имени.
find . -type f -name "*.ext3" | while read file
do
mv "$file" "${file%.ext3}"
done
Немного безопаснее было бы использовать find . -name "*.exe" -print0
, который разделяет имена файлов с нулями вместо возвратов. Это полезно, если в названии файла есть. Затем вы должны установить переменную IFS
для обработки нулей, а не пробелов, табуляции и NL.