Как я могу переименовать несколько файлов, удалив символ или строку?

21

Как продолжение моего предыдущего вопроса , если у меня есть несколько файлов в форме

sw.ras.001
sw.ras.002
sw.ras.003
…

Какую команду я могу использовать для удаления ras.в середине всех файлов?

Павел
источник
Вы хотите удалить Есть толькоras , т.е. в конечном итоге sw..001, или ras., в результате чего sw.001?
Кевин
я бы наверное хотел убрать «ras». будет ли команда сильно отличаться?
Paul
Нет, просто включите ли вы \.в шаблоны.
Кевин

Ответы:

35

Вы можете сделать это с помощью довольно небольшой модификации любого ответа из последнего вопроса:

rename s/ras\.// sw.ras.*

или

for file in sw.ras.*; do
    mv "$file" "${file/ras./}"
done

Объяснение:

renameэто perlскрипт, который принимает perlрегулярное выражение и список файлов, применяет регулярное выражение к имени каждого файла по очереди и переименовывает каждый файл в результате применения регулярного выражения. В нашем случае rasсопоставляется буквально и \.совпадает с литералом .(поскольку .один указывает на любой символ, кроме новой строки), и он заменяет его ничем.

forЦикл принимает все файлы , которые начинаются с sw.ras.(стандартной оболочкой Glob) и петлю над ними. ${var/search/replace}поиск $varпо searchи заменяет первое вхождение с replace, так ${file/ras./}возвращается $fileс первым ras.удалены. Таким образом, команда переименовывает файл с тем же именем минус ras.. Обратите внимание, что при этом поиск и замена, .воспринимается буквально, а не как специальный символ.

Kevin
источник
Не могли бы вы объяснить свой ответ учащимся? Что делает "s / ras \ .// sw.ras. *"? Думаю, я это знаю, но хочу быть уверенным, и другие тоже могут учиться. Второй вариант такой же.
H_7
1
@ H_7 Хорошая идея, я добавил объяснение.
Кевин
14

Другой вариант - использовать mmv (Mass MoVe и переименовать):

mmv '*ras.*' '#1#2'

Не забудьте использовать одинарные кавычки вокруг ваших шаблонов, в противном случае звезды будут расширяться на уровне оболочки.

Утилита не всегда доступна, но если это не так, вы можете установить ее с помощью:

sudo apt-get install mmv

Смотрите страницу руководства здесь .

AlexG
источник
1
Это отличный инструмент !!!
Кристиан
5

В любом POSIX-совместимой оболочки ( bash, dash, kshи т.д.):

for file in sw.ras.[[:digit:]][[:digit:]][[:digit:]]; do
    mv "${file}" "${file/ras\./}"
done

Или с rename:

rename 's/ras\.//' sw.ras.[[:digit:]][[:digit:]][[:digit:]]
Крис Даун
источник
1

Недавно мне пришлось сделать массовое переименование ряда файлов, где мне пришлось заменить последнее вхождение символа, когда этот символ встречался несколько раз в именах файлов. В этом конкретном случае мне пришлось заменить последнюю черту -на подчеркивание _, повернув это:

some-long-file-name.ext

в это:

some-long-file_name.ext

Это заняло некоторое время, но это, наконец, сделал это:

for FILE in *; do mv $FILE ${FILE%-*}_${FILE##*-}; done

Вот:

  • ${i%-*} соответствует началу имени файла до последнего появления тире -
  • ${file##*-} соответствует остальной части имени файла после последнего появления тире -
gopherIT
источник