Intereting Posts
Что символизирует и как я могу узнать, как это сделать? Как печатать в PDF при добавлении к существующему документу? Узнайте, что вызывает случайные перезагрузки, если / var / log / syslog пуст Установка ArchLinux – ошибка при форматировании раздела файловой системы конвертировать soft-to hardlinks с помощью cp Как получить информацию о жестком диске из / proc и / или / sys Любые реализации unix с «плоскими» файловыми системами на основе тегов? Как открыть приложения в оконном менеджере TWM без использования xterm Как я могу переместить мой / загрузочный раздел? команда find с несколькими шаблонами, не возвращающими никакого вывода Разделить страницы в pdf Как получить byobu для запуска при запуске с выполненной командой, как root? Безопасно ли использовать echo для передачи конфиденциальных данных в chpasswd? Как выполняется поиск в файле (поиск) или автозаполнение? Жесткие диски не будут вращаться с помощью команды hdparm

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

Мне нужно уточнить немного больше. Эти команды на самом деле предназначены для BSS FTN tosser. Файл конфигурации, для которого находятся эти команды, разрешает только определенные объявления. Вот несколько примеров:

exec "/home/imp/imp/poll.sh" *.su? *.mo? *.tu? *.we? *th? *.fr? *.sa? *.pkt flag toss!.now [0-9a-Z][0-9a-Z][0-9a-Z][0-9a-Z][0-9a-Z][0-9a-Z][0-9a-Z][0-9a-Z].??? exec "/home/imp/imp/poll.sh /home/imp/hpt/secure" /home/imp/hpt/secure/*.[STFWMstfWM][ouaherOUAHER][0-9A-ZA-a] *.[pP][kK][tT] 

Поэтому я хочу использовать этот синтаксис (например, [0-9a-z]). Проблема в том, что почтовая программа ищет имена файлов в нижнем регистре, но существуют только имена в верхнем регистре.

Я пытаюсь преобразовать файл из верхнего регистра в нижний регистр, используя синтаксис ниже:

 mv /home/imp/hpt/outbound/[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z].[STFWMfWM][OUAHER][0-9] /home/imp/hpt/outbound/[0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z].[stfwm][ouaher][0-9a-za-a] 

Я не думаю, что у меня правильный синтаксис.

Вот пример имени файла, который я хочу переименовать:

0000FE70.FR0

Всем приветствуется всяческая помощь. Благодарю.

Этот ответ от Alex B в Stack Overflow поможет вам переименовать оба файла и подпапки в каталог.

Он состоит в использовании команд find и rename Linux. Я бы добавил, что команда, указанная в ссылке выше, также изменит имена каталогов. Если вы хотите только изменить имена файлов, вам необходимо изменить параметр -depth следующим образом: -type f .

Другое регулярное выражение, данное команде rename может быть ниже, что, я думаю, легче понять.

  find my_root_dir -type f -execdir rename 'y/AZ/az/' {} \; 

Имейте в виду, что между регулярным выражением команды rename и фигурными фигурными скобками существует необходимое пробел, а другое между ними и символ завершения команды \;

Также помните, что он будет переименовывать каждый файл не только в каталог, в котором вы выполняете команду из (каталог my_root_dir ), но также и ко всем файлам под каждой my_root_dir содержащейся в этом файле. Вы можете использовать параметр -maxdepth 0 с командой find чтобы заставить его применять тесты и действия непосредственно к стартовым точкам.

Всякий раз, когда вы хотите изменить один класс символов на другой, используйте tr .

 for f in *; do test -f "$f" && echo mv "$f" "$( tr '[:upper:]' '[:lower:]' <<<"$f" )" done 

Сценарий переименует все файлы в текущем каталоге на все строчные буквы. Он будет пропускать каталоги. Удалите echo если вы уверены, что он делает то, что вы хотите. Вы можете заменить [:upper:] и [:lower:] на AZ и az соответственно, если у вас есть только стандартные имена файлов ASCII (примечание: AZ , а не [AZ] ).

Альтернативно, используя встроенную подстановку переменных Bash в верхнем и нижнем регистре:

 for f in *; do test -f "$f" && echo mv "$f" "${f,,}" done 

Простой сценарий rename-lower для текущего каталога, если команда rename не работает, вы можете изменить в mv.

 #/bin/bash # script to replace all upper case to lower case for i in * do d=$(echo ${i} |tr [:upper:] [:lower:]); if [ ${d} != ${i} ] then echo "renaming:" ${i} ${d} rename ${i} ${d} ${i} # mv ${i} ${d} fi done 

пример

 $ ls tmp.EwcM2s6kfU tmp.kcUX6rtjiu tmp.kzpqLvWcnQ tmp.N1H8bLt1at $ rename-lower renaming: tmp.EwcM2s6kfU tmp.ewcm2s6kfu renaming: tmp.kcUX6rtjiu tmp.kcux6rtjiu renaming: tmp.kzpqLvWcnQ tmp.kzpqlvwcnq renaming: tmp.N1H8bLt1at tmp.n1h8blt1at 

С zsh :

 autoload zmv # best in ~/.zshrc zmv '[[:alnum:]](#c8).[STFWMfWM][OUAHER][0-9]' '${(L)f}' 

Это потребует проверки потенциальных конфликтов.

Вот ты где:

 for i in $( ls | grep [AZ] ); do mv -f $i `echo $i | tr 'AZ' 'a-z'`; done 

И это пример, показывающий, как это работает:

 X$ ls 123123HHHSK FILE_[1-10] DB FILE1 FILE_{1-10} SQL X$ for i in $( ls | grep [AZ] ); do mv -f $i `echo $i | tr 'AZ' 'a-z'`; done X$ ls 123123hhhsk file_[1-10] db file1 file_{1-10} sql 

EDIT : Мы могли бы легко использовать опцию -f , чтобы избежать использования yes y .

Ваша команда mv не работает должным образом, потому что происходит то, что оболочка расширяет подстановочные знаки, а результат представляет собой один список имен файлов, который передается в mv . Синтаксисом mv является mv SOURCE1 SOURCE2 … DESTINATION , т.е. все аргументы, кроме последнего, являются именами файлов, которые должны быть перемещены в пункт назначения. mv не поддерживает переименование на основе шаблонов.

Если у вас есть утилита prename , вы можете использовать ее для переименования файлов, запустив Perl-код для каждого имени. Синтаксис – это prename PERL-CODE FILENAME1 FILENAME2 … Имя файла находится в переменной $_ , а функция lc преобразует свой аргумент в lowerecase, поэтому вы можете использовать следующий код:

 prename '$_ = lc($_)' /home/imp/hpt/outbound/[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z].[STFWMfWM][OUAHER][0-9] 

Если у вас нет этой утилиты, вы можете загрузить версию из CPAN .

Кроме того, вы можете выполнить переименование в оболочке с помощью цикла. В bash вы можете использовать ${x,,} чтобы получить значение x преобразованное в нижний регистр.

 for x in /home/imp/hpt/outbound/[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z].[STFWMfWM][OUAHER][0-9]; do mv "$x" "${x,,}" done