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

16

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

Я ищу команду oneliner .

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

    
задан Unamata Sanatarai 18.04.2013 в 14:36
источник

3 ответа

20

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

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

В верхнем регистре обратные аргументы для [:lower:] [:upper:]

% ссылка команды co_de% ссылка

Обновление

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

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

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

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

Обновить добавлена опция a_file для команды -v согласно sds .

    
ответ дан Stef K 18.04.2013 в 14:57
источник
16

Существует более элегантная и общая утилита, называемая prename .

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

Используя его, вы можете переименовать несколько файлов в одну команду, предоставив любое выражение perl (включая, но не ограничиваясь, замену s/// или char транслитерации 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"}'  *

И так далее.

Еще одна приятная вещь о prename заключается в том, что она защищает вас, в случае переименования файла в существующее имя файла.

man prename для более подробной информации.

    
ответ дан arielf 20.04.2013 в 04:19
1

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

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

Для find

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

Для rename

  • -n, -nono : Нет действий: печатать имена файлов, которые нужно переименовать, но не переименовывать.
  • y/source/dest/ : Транслитерировать символы в пространстве шаблонов, которые появляются в источнике, соответствующему символу в dest.
ответ дан Pablo Bianchi 16.03.2017 в 03:27