Використовуйте це для bash
:
find $1 -name "* *.xml" -type f -print0 | \
while read -d $'\0' f; do mv -v "$f" "${f// /_}"; done
find
буде шукати файли з пробілом у назві. Імена файлів будуть надруковані з нульбайтом ( -print0
) як роздільник, щоб також впоратися зі спеціальними іменами. Потім read
вбудований читає назви файлів, відмежовані нульбайтом, і, нарешті, mv
замінює пробіли підкресленням.
EDIT: Якщо ви теж хочете видалити пробіли в каталогах, це трохи складніше. Каталоги перейменовані, а потім вже не доступні за назвою find
знахідок. Спробуйте це:
find -name "* *" -print0 | sort -rz | \
while read -d $'\0' f; do mv -v "$f" "$(dirname "$f")/$(basename "${f// /_}")"; done
sort -rz
Змінює порядок файлу, так що найглибші файли в папці є першими для переміщення і сама папка буде останнім. Отже, ніколи не перейменовані папки, перш ніж усі файли та папки будуть перейменовані всередині неї. mv
Команда в циклі трохи змінився теж. У цільовому імені ми видаляємо лише пробіли в базовій імені файлу, інакше він не був би доступний.