38

Например, я хочу mv (.*?).sql $1.php ,

Есть ли команда, которая позволяет мне указать шаблоны переименования?

5 ответов5

32

Как уже упоминали другие, rename хорошо в этом, но прочитайте man-страницу (man rename), прежде чем попробовать. Существует по крайней мере два совершенно разных инструмента, называемых rename и какой у вас будет зависеть от вашего дистрибутива. Называть их неправильно может быть опасно.

Вот справочная страница для версии на основе Perl Ларри Уолла, которая поставляется с Ubuntu. Вы даете ему выражение perl, например, rename 's/\.sql$/.php/' *.sql

Вот справочная страница для переименования, которая поставляется со старыми дистрибутивами Red Hat и CentOS. Использование - это простая подстановка строк, например, rename .sql .php *.sql

Вы также можете использовать bash one-liner для обработки каждого файла по одному:

$ for f in *.sql; do mv -i "$f" "${f%%.*}.php"; done
10

Есть rename(1), который не использует регулярные выражения, но может решить вашу проблему:

rename .sql .php *.sql

Там также mmv(1), но я не знаю, как это работает.

5

G'day,

Вы также можете попробовать войти

for i in $(\ls -d *.sql)
do
mv $i $(echo $i | sed -e 's/\.sql$/\.php/')
done

Или, чтобы заставить это использовать регулярное выражение, измените это немного, чтобы

for i in $(\ls -d | egrep -e '.*\.sql')
do
mv $i $(echo $i | sed -e 's/\.sql$/\.php/')
done

для немного веселья кодирования оболочки. (-:

1

Будучи водопроводчиком, я люблю трубы :)

Примечание: этот ответ многословен - как новичок я ценю, когда кто-то, кто знает, находит время, чтобы объяснить, поэтому я плачу «вперед». Если вы не новичок, прошу прощения за длину и многословие.

ls -1 *_201[67][0-9]* | sed -e 's/\(\(.\+\)[-_]\(201[67][0-9]\{4\}\)\([^.]\+\)\?\.[0-9a-z]\{2,3\}\)/mkdir -p \2\/\3; mv \1 \2\/\3\/\1/' | bash

Куда:

ls -1 *_201[67][0-9]*

перечисляет все файлы, соответствующие шаблону, в этом случае я ищу файлы с датой в имени файла в форме «ГГГГММДД»

sed -e 's/\(\(.\+\)[-_]\(201[67][0-9]\{4\}\)\([^.]\+\)\?\.[0-9a-z]\{2,3\}\)/mkdir -p \2\/\3; mv \1 \2\/\3\/\1/'
#        : | |    |     |                  | |       |                    |:                                 :
#        : |^2....^    ^3..................^^4.......^                    |:                                 :
#        :^1..............................................................^:                                 :
#        /................filename.................pattern................./...mkdir...and....mv...command.../

^ 1: 1-я группа захвата - все имя файла

^ 2: 2-я группа захвата - 1-я часть шаблона имени файла

^ 3: 3-я группа захвата - вторая часть имени файла - здесь, дата в формате «ГГГГММДД»

^ 4: 4-я группа захвата - необязательная часть имени файла между датой и расширением и само расширение

Оооочень .... если у меня есть файл с именем

CallLog_555123412_20161231-214403.7z

...затем

mkdir -p \2\/\3; mv \1 \2\/\3\/\1

на самом деле означает

# make directory and sub-directory
mkdir -p CallLog_555123412/20161231
# move file from current directory to sub-sub-directory just created
mv CallLog_555123412_20161231-214403.7z CallLog_555123412/20161231/CallLog_555123412_20161231-214403.7z

Обратите внимание, что вывод команды sed передается в 'bash' для ее выполнения. Чтобы сначала увидеть предлагаемые перемещения файлов БЕЗ их фактического перемещения, сначала удалите '| bash 'в конце, и попробуйте так:

ls -1 *_201[67][0-9]* | sed -e 's/\(\(.\+\)[-_]\(201[67][0-9]\{4\}\)\([^.]\+\)\?\.[0-9a-z]\{2,3\}\)/mkdir -p \2\/\3; mv \1 \2\/\3\/\1/'

Это не будет вносить никаких изменений, но вы увидите команду, которая будет выполнена, если вы запустите ее с помощью '| bash 'помечен на конце.

Это полезно, потому что вы можете создавать любые подкаталоги, которые вы хотите, из частей в имени файла, или что-либо еще, что вы добавляете к тексту «замены» в команде sed. Обратите внимание, что sed требует много экранирующих символов.

SED Regex скобки:

(...) требуется экранирование для группировки захвата -> \(...\)

{m, n} требует экранирования для количественной оценки предыдущего объекта -> \{m, n \}

/ требует экранирования в строке замены -> \/

[...] НЕ требует экранирования для классов персонажей

\1 в строке замены относится к 1-й захваченной группе и так далее ...

ПРЕДУПРЕЖДЕНИЕ О БЕЗОПАСНОСТИ: НИКОГДА НЕ ТРУПИТЕ НИЧЕГО, ЧТОБЫ «БЫТЬ», ЕСЛИ ВЫ ПОЛНОСТЬЮ НЕ ПОНИМАЕТЕ ИТОГО ...

Надеюсь, что это поможет устранить некоторые блокировки :)

1

Установите mmv , затем сделайте это:

mmv "*.sql" "#1.php"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .