Переименовать файлы в нижний регистр
Переименовать все файлы в текущей и во всех вложенных директориях в нижний регистр:
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'ы.
Автор: keltanas
comments powered by Disqus