Переименовать файлы в нижний регистр

Переименовать все файлы в текущей и во всех вложенных директориях в нижний регистр:

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'ы.


Создано:
Автор:
« Назад на главную

comments powered by Disqus
Fork me on GitHub