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


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.. Обратите внимание, что при этом поиск и замена, .воспринимается буквально, а не как специальный символ.


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

1
@ H_7 Хорошая идея, я добавил объяснение.
Кевин

14

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

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

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

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

sudo apt-get install mmv

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


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##*-} соответствует остальной части имени файла после последнего появления тире -
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.