Я хотел бы рекурсивно переименовать все файлы и папки (подпапки) в верхний регистр.
Я нашел несколько сценариев, которые будут делать это в нижнем регистре, но я не знаю, как их изменить, чтобы он делал это наоборот (снизу вверх).
Сценарий, который я нашел и работает для строчных букв, но я не знал, как его изменить:
rename 'y/A-Z/a-z/' *
Это из man rename
.
rename 'y/a-z/A-Z/' *
вы получите то, что вы хотите. Тщательно, когда вы проверяете это до конца.Ответы:
Обратите внимание, что вы используете скрипт Perl, называемый
rename
распространяемым Debian и производными (Ubuntu, Mint,…). Другие дистрибутивы Linux поставляют совершенно другую и значительно менее полезную командуrename
.y/A-Z/a-z/
переводит каждый символ в диапазонеA
черезZ
в соответствующий символ в диапазонеa
черезz
, т.е. ASCII прописных букв в соответствующей строчной буквы. Для выполнения обратного перевода используйтеy/a-z/A-Z/
. Другой способ написать ту же команду , котораяrename '$_ = uc($_)' *
-uc
это у PPER с функцией азы, аrename
команда переименовывает файлы , основанная на преобразовании из к$_
переменному.rename '…' *
переименовывает только файлы в текущем каталоге, потому что это то, что*
соответствует. Точечные файлы (файлы, с которых начинается название.
) тоже пропускаются.Если вы хотите рекурсивно переименовывать файлы в текущем каталоге и в подкаталогах, вы можете использовать
find
команду для рекурсивного обхода текущего каталога. Здесь возникает трудность: если вы позвонитеrename
, это переименует и каталог, и часть базового имени. Если выrename
обращаетесь к каталогу, прежде чем возвращаться в него (find -exec rename … {} \;
), онfind
запутывается, потому что он нашел каталог, но этот каталог больше не существует, когда он пытается спуститься в него. Вы можете обойти это, попросивfind
пройти по каталогу, прежде чем действовать, но затем вы попытаетесь переименоватьfoo/bar
его,FOO/BAR
но каталогFOO
не существует.Простой способ избежать этой трудности - заставить команду переименования действовать только на часть базового имени пути. Регулярное выражение
([^/]*\Z)
соответствует последней части пути, которая не содержит/
.Оболочка zsh предоставляет более удобные функции для переименования - даже более загадочно, чем Perl, но более краткая и часто более простая для составления.
Функция
zmv
переименовывает файлы на основе шаблонов. Запуститеautoload -U zmv
один раз, чтобы активировать его (поместите эту строку в свой.zshrc
).В первом аргументе
zmv
(шаблон для замены) вы можете использовать мощные шаблоны шаблонов zsh . Во втором аргументеzmv
(текст замены) вы можете использовать функции расширения его параметров , включая модификаторы истории .Объяснение:
-w
- автоматическое присвоение числовых переменных каждому шаблону подстановки**/*
- все файлы в подкаталогах, рекурсивно (**/
соответствует 0, 1 или более уровням подкаталогов)$1
- первая числовая переменная, здесь совпадающая с частью каталога каждого пути$2:u
- вторая числовая переменная, здесь совпадающая с частью базового имени каждого пути, с:u
модификатором для преобразования значения в верхний регистрВ качестве дополнительного бонуса это учитывает настройки окружающего языка.
Если вы не уверены в
zmv
написанной вами команде, вы можете передать-n
опцию, чтобы напечатать, что будет делать команда, и ничего не менять. Проверьте вывод и, если он делает то, что вы хотите, повторно запустите команду без-n
фактического действия.источник
Украденный (с незначительным редактированием) из поста Жиля здесь
find <DIR> -depth -type d -exec rename -n 's!/([^/]*/?)$!\U/$1!' {} +
источник
find <dir> -exec rename 'y/a-z/A-Z/' {} \;
find
как возвращаетесь в них.find <dir> -depth -exec rename 'y/a-z/A-Z/' {} \;
следует решить вопрос с переименованием каталогов. Правильный?rename
изменения , например ,foo/bar
кFOO/BAR
иFOO
не существует в этой точке.Я хотел бы направить любого, кто все еще связан с этим ответом, к превосходному ответу, который Гилес Квернот дал на этот вопрос, который не требует
find
.В результате команда будет:
Но перед запуском, пожалуйста, прочитайте ответ, связанный с предостережениями относительно старых версий bash.
Наконец, в случае, если кому-то интересно, что делает
y///
командаperl regex
. Вот ссылка на соответствующую документацию .источник
find -execdir
| переименованиеЭто был бы лучший способ сделать это, если бы не безумие относительного пути, так как Perl regex fu не действует только на базовое имя:
-execdir
сначалаcd
в каталог, прежде чем выполнять только по базовому имени.К сожалению, я не могу избавиться от этой
PATH
хакерской части,find -execdir
отказывается что-либо делать, если у вас есть относительный путь вPATH
...: /ubuntu/621132/why-using-the-execdir-action- является нестабильным-для-каталог-который-является-в-пути / 1109378 # 1109378источник
Попробуйте это после перемещения в каталог, где вы хотите переименовать файлы:
источник
ls -l
обрезку столбцов, отличных от имени?) И используйте двойные кавычки вокруг подстановок переменных . Ваш код слишком сложен и разбит на имена файлов, содержащие пробелы и другие специальные символы. Используйтеfind
или,**/
чтобы перейти в подкаталоги, выходные данныеls
предназначены только для потребления человеком.