Один лайнер для переименования пучка файлов

Я искал однострочный интерфейс командной строки linux, чтобы переименовать кучу файлов за один снимок.

pattern1.a  pattern1.b pattern1.c ...

Как только команда будет выполнена, я должен получить

pattern2.a  pattern2.b pattern2.c ...

Ответ 1

for i in pattern1.*; do mv -- "$i" "${i/pattern1/pattern2}"; done

Прежде чем запускать его, вставьте echo перед mv, чтобы увидеть, что он будет делать.

Ответ 2

Если вы используете Linux, у вас также может быть perl script at/usr/bin/rename, который cane переименовывает файлы на основе более сложных шаблонов, чем разрешает shell globbing.

/usr/bin/rename на одной из моих систем документируется здесь. Его можно использовать следующим образом:

rename "s/pattern1/pattern2/" pattern1.*

Число других сред Linux > похоже, имеет другой rename, который может быть использован следующим образом:

rename pattern1 pattern2 pattern1.*

Подробнее о man rename в вашей системе.

Ответ 3

Множество способов кожи этой кошки. Если вы предпочитаете, чтобы ваш шаблон был регулярным выражением, а не файловым глобусом, и вы хотели бы сделать это рекурсивно, вы можете использовать что-то вроде этого:

find . -print | sed -ne '/^\.\/pattern1\(\..*\)/s//mv "&" "pattern2\1"/p'

Как предложил Керрек с его ответом, этот сначала показывает вам, что он будет делать. Выполните вывод через оболочку (т.е. Добавьте | sh в конец), как только вам станет удобно с командами.

Это работает для меня:

[[email protected] ~]$ ls -l foo.*
-rw-r--r--  1 ghoti  wheel  0 Mar 26 13:59 foo.php
-rw-r--r--  1 ghoti  wheel  0 Mar 26 13:59 foo.txt
[[email protected] ~]$ find . -print | sed -ne '/^\.\/foo\(\..*\)/s//mv "&" "bar\1"/p'
mv "./foo.txt" "bar.txt"
mv "./foo.php" "bar.php"
[[email protected] ~]$ find . -print | sed -ne '/^\.\/foo\(\..*\)/s//mv "&" "bar\1"/p' | sh
[[email protected] ~]$ ls -l foo.* bar.*
ls: foo.*: No such file or directory
-rw-r--r--  1 ghoti  wheel  0 Mar 26 13:59 bar.php
-rw-r--r--  1 ghoti  wheel  0 Mar 26 13:59 bar.txt
[[email protected] ~]$