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

Есть ли способ переименовать все файлы в каталоге в нижний регистр | в верхний регистр?

Ищу команду oneliner .

Мне понравился TotalCommander's alt+f7, теперь мне нужна эта функциональность в терминале

17
задан 16 March 2017 в 05:44

4 ответа

Для каждого файла a_file в текущем каталоге переименуйте a_file в нижний регистр.

for a_file in *;do mv -v "$a_file" `echo "$a_file" | tr [:upper:] [:lower:]` ;done;

Для заглавных букв переведите аргументы в [:lower:] [:upper:]

tr справочник команд ссылка

Обновление

Для еще большего контроля * можно заменить на ls.

Например, в каталоге, содержащем 1.txt, 2.txt, 3.txt, 1.jpg, 2.jpg и 3.jpg для фильтрации только файлов * .jpg, ls может быть used:

for a_file in $(ls *.jpg);do mv -v $a_file `echo $a_file | tr [:upper:] [:lower:]` ;done;

Приведенный выше код назначит переменной a_file все файлы с расширением .jpg.

Обновление добавило опцию -v в команду mv в соответствии с sds .

0
ответ дан 16 March 2017 в 05:44

Существует более изящная и общая названная утилита prename.

Записанный Larry Wall, это идет perl таким образом, это уже наиболее вероятно доступное в Вашей системе как /usr/bin/prename (если у Вас есть альтернативы установки, может также быть доступным как /usr/bin/rename symlinked через/etc/alternatives к prename)

Используя его можно переименовать несколько файлов в одной команде путем обеспечения любого выражения жемчуга (включая, но не ограничиваясь, заменой s/// или символьная транслитерация tr///):

Примеры:

# Lowercase all *.JPG filenames:
prename tr/A-Z/a-z/ *.JPG

# Change any 'No' in a filename to a 'Yes':
prename s/No/Yes/g *No*

# increment first sequence of digits in a filename by 3:
prename 's/([0-9]+)/$1+3/e' *[0-9]*

# If a file contains 'aaa', append '.bak' to its name
prename 'if (/aaa/) {$_ .= ".bak"}'  *

И так далее.

Другая хорошая вещь о предварительном имени состоит в том, что оно защищает Вас, в случае переименования файла к существующему имени файла.

man prename для получения дополнительной информации.

16
ответ дан 16 March 2017 в 05:44

Использование find

find . -name * -type f -exec rename 'y/A-Z/a-z/' '{}' \;

Для find

  • Конечно, после -name поместите свой паттерн.
  • -maxdepth 0: только текущий каталог.

Для rename

  • -n, -nono: никаких действий: печатать имена файлов, которые нужно переименовать, но не переименовывать.
  • y/source/dest/: Транслитерировать символы в пространстве образца, которые появляются в источнике, в соответствующий символ в dest.
0
ответ дан 16 March 2017 в 05:44

Использование mmv для преобразования совпадающей строки в верхний регистр:

$ mmv -r '*' '#u1'

Важно заключить шаблон в кавычки, иначе вместо этого будет расширен подстановочный знак.

0
ответ дан 11 January 2020 в 03:35

Другие вопросы по тегам:

Похожие вопросы: