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

17

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

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

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

Унамата Санатарай
источник

Ответы:

20

Для каждого файла 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можно использовать:

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

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

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

Стеф К
источник
4
вы можете передать "-v", mvчтобы увидеть, что делается; Возможно, вы не захотите передавать «-f», потому что это может привести к сбою существующих файлов
sds
Это не работает для файлов с пробелами в их имени.
Тяньсян Сюн
Вы можете использовать кавычки вокруг имени файла.
Stef K
2
Извините, но часть о ls * jpg - плохая идея. mywiki.wooledge.org/ParsingLs Вы можете достичь того же результата с * jpg там, где вы были * в первую очередь.
Тинк
16

Есть более элегантная и общая утилита под названием prename.

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

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

И так далее.

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

man prename Больше подробностей.

arielf
источник
1

С помощью find

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

За find

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

За rename

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