Переименование файлов в Linux с помощью регулярного выражения

9

У меня была группа файлов, которую я хотел бы последовательно переименовывать, файлы называются такими вещами, как

"System-Log-01-01-2009-NODATA.txt"
"Something-Log-01-01-2009-NODATA.txt"

И я хотел их в нижнем регистре, ггггммдд, расширение .log

"system.20090101.log"
"something.20090101.log"
Усама ALASSIRY
источник

Ответы:

14

Для этого я писал сценарии на Perl, пока не обнаружил команду переименования.

Он принимает регулярное выражение Perl для переименования:

для этого я просто набрал две команды:

rename 's/(\w+)-(\w+)-(\d\d)-(\d{4})-NODATA.txt\$1.$4$3$2.log$//' *
rename 'y/A-Z/a-z/' *.log

Однако для некоторых дистрибутивов renameэта функциональность отсутствует (см. Справочную страницу), и вам, возможно, придется установить perl-renameили prename.

Усама ALASSIRY
источник
очень хороший ответ
Judioo
8
Осторожно, некоторые дистрибутивы отправляют бесполезную команду переименования. Проверьте, какой ваш дистрибутив первым.
Дероберт
Я знал, mmvно в конце концов благодаря renameя могу использовать силу регулярных выражений
Людовик Куты
5
На Arch Linux это так perl-rename.
Олег Припин
6

Поскольку у меня нет команды переименования, я полагаюсь на это:

for myfile in /my/folder/*; do
    target=$(echo $myfile|sed -e 's/foo/bar/g')
    mv "$myfile" "$target"
done
Франц Беттаг
источник
5

mmv - это стандартная утилита linux для перемещения / переименования нескольких файлов. Он доступен в репозиториях для большинства дистрибутивов. Для вашего примера выше, вы можете сделать:

mmv *-Log-*-*-*-NODATA.txt #l1.#4#3#2.log

Для получения дополнительной информации, прочитайте эту статью или справочную страницу .

Хэмиш Даунер
источник
5

renameУтилита не очень "стандартная". Каждый дистрибутив поставляется с другим renameинструментом. Например, здесь, в Gentoo, renameон из sys-apps/util-linuxпакета и не поддерживает регулярные выражения.

Хэмиш Даунер предположил mmv, что это кажется полезным, особенно для использования внутри скриптов.

С другой стороны, в общем случае вы можете захотеть переименовать . Он имеет qmvи qcpкоманды, которые откроют текстовый редактор по вашему выбору (мое предпочтение: Vim) и позволят вам редактировать имена файлов назначения там. После сохранения и закрытия редактора, qmv/ qcpсделает все переименование.

Оба mmvи qmvдостаточно умны, чтобы переименовывать файлы в правильном порядке, а также обнаруживать циклическое переименование, и автоматически создают временный файл, если это необходимо.

Денилсон Са Майя
источник
В Gentoo вы также можете установить sys-apps/renameпакет, который даст вам возможность renamexmпереименовать регулярное выражение, а также массовые прописные / строчные буквы и другие полезные вещи
radicand
1

По честному:

rename 's/(\w+)-(\w+)-(\d\d)-(\d{4})-NODATA.txt\$1.$4$3$2.log$//' *.txt

дает этот вывод:

Use of uninitialized value $4 in regexp compilation at (eval 1) line 1.
Use of uninitialized value $3 in regexp compilation at (eval 1) line 1.
Use of uninitialized value $2 in regexp compilation at (eval 1) line 1.

Но:

rename -n 's/(\w+)-\w+-(\d{2})-(\d{2})-(\d{4})-NODATA\.txt$/$1.$4$3$2\.log/' *.txt && rename 'y/A-Z/a-z/' System.20090101.log

дает правильный вывод:

System-Log-01-01-2009-NODATA.txt renamed as System.20090101.log
System.20090101.log renamed as system.20090101.log

замена {-n} переключателя на {-v}

fpba
источник
1

Я создал небольшой скрипт bash для этого:

#!/bin/bash

for f in `ls /path/to/folder`; do
  # Create new filename from the old one
  # This example replaces A (upper case) with a (lower case)
  new_file=`echo "$new_file" | tr A a`

  # Rename the file
  mv "$f" "$new_file"
done
bjarkig82
источник
В общем случае lsвывод синтаксического анализа - не самая лучшая идея. Случайный поиск обнаружил это длинное чтение в Unix. SE для вашего развлечения. | Кроме того, ваш ответ лучше сопоставить с вопросомtr '[:upper:]' '[:lower:]'
HBruijn