Есть ли способ переименовать все файлы в каталоге в нижний регистр | верхний регистр?
Я ищу команду oneliner .
Я любил TotalCommander's alt+f7
, теперь мне нужна эта функциональность в терминале
Есть ли способ переименовать все файлы в каталоге в нижний регистр | верхний регистр?
Я ищу команду oneliner .
Я любил TotalCommander's alt+f7
, теперь мне нужна эта функциональность в терминале
Ответы:
Для каждого файла 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 .
Есть более элегантная и общая утилита под названием 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
Больше подробностей.
find
find . -name * -type f -exec rename 'y/A-Z/a-z/' '{}' \;
find
-name
поставить свой шаблон.-maxdepth 0
: Только текущий каталог.rename
-n, -nono
: Никаких действий: печатать имена файлов, которые нужно переименовать, но не переименовывать.y/source/dest/
: Транслитерация символов в пространстве образца, которые появляются в источнике, в соответствующий символ в dest.
mv
чтобы увидеть, что делается; Возможно, вы не захотите передавать «-f», потому что это может привести к сбою существующих файлов