Переименовать все файлы в текущей и во всех вложенных директориях в нижний регистр:
~$ find ./ -type f | awk '{ print $1 " " tolower($1) }' | xargs -L 1 mv
Харитон Мизгирь пишет: Чтобы обрабатывались пути с пробелами и проч. непечатностями надо использовать конструкцию типа:
~$ find -print0 | xargs -0
Объяснение по поводу параметра -print0 (find'а) и -0 (xargs'а)
В имени файла может попасться символ, который требует экранирования при обработке (single or double quotes, spaces or newlines). print0
заставляет выводить список найденных файлов разделяя их через нуль-символ ('\0', в духе языка C, где он используется для декларации конца строки). xargs
тоже должен быть готов к такому разделителю, для этого служит -0
.
find
и xargs
по разному себя ведет когда ищут из текущей директории или когда ищут из родительской (в родительской прекрасно обрабатывал директории с пробелами и любыми кавычками, которые находились в дочерней директории). newlines не обрабатывается нигде.
Провел такой эксперимент. Создал скрипт (в файле):
mkdir "Bad \
bad \
bad \
dir"
– получил директорию с newlines.
Создал там файл README.txt и попытался его найти:
touch README.txt
cd ..
find . -name README.txt | xargs -I % ls %
Получил ошибку:
xargs: unmatched одинарная quote; by default quotes are special to xargs unless you use the -0 option
(загадочное сообщение: "по умолчанию кавычки обрабатываются xargs, если только вы не используете параметр -0")
Та же команда в связке print0-0 работает нормально:
find . -name README.txt -print0 | xargs -0 -I % ls %
Ошибки, которые возникали в текущей директории (в родительской все было нормально):
ls: ./Временнаяnдиректория/README.txt: No such file or directory
То есть использование связки print0 ... -0
желательно всегда. Можно прописать через alias
'ы.