Используйте это с bash
:
find $1 -name "* *.xml" -type f -print0 | \
while read -d $'\0' f; do mv -v "$f" "${f// /_}"; done
find
будет искать файлы с пробелом в имени. Имена файлов будут напечатаны с помощью nullbyte ( -print0
) в качестве разделителя, чтобы также обрабатывать специальные имена файлов. Затем read
встроенный модуль считывает имена файлов, разделенные нулевым байтом, и, наконец, mv
заменяет пробелы подчеркиванием.
РЕДАКТИРОВАТЬ: Если вы хотите удалить пробелы в каталогах тоже, это немного сложнее. Каталоги переименовываются и больше не доступны для поиска по именам find
. Попробуй это:
find -name "* *" -print0 | sort -rz | \
while read -d $'\0' f; do mv -v "$f" "$(dirname "$f")/$(basename "${f// /_}")"; done
sort -rz
Изменяет порядок файла, так что самые глубокие файлы в папке являются первыми для перемещения и сама папка будет последним. Таким образом, папки никогда не переименовываются, пока все файлы и папки не переименованы внутри. Команда mv
в цикле тоже немного изменена. В имени цели мы удаляем только пробелы в базовом имени файла, иначе он не будет доступен.