Как продолжение моего предыдущего вопроса , если у меня есть несколько файлов в форме
sw.ras.001
sw.ras.002
sw.ras.003
…
Какую команду я могу использовать для удаления ras.в середине всех файлов?
\.в шаблоны.
Как продолжение моего предыдущего вопроса , если у меня есть несколько файлов в форме
sw.ras.001
sw.ras.002
sw.ras.003
…
Какую команду я могу использовать для удаления ras.в середине всех файлов?
\.в шаблоны.
Ответы:
Вы можете сделать это с помощью довольно небольшой модификации любого ответа из последнего вопроса:
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.. Обратите внимание, что при этом поиск и замена, .воспринимается буквально, а не как специальный символ.
Другой вариант - использовать mmv (Mass MoVe и переименовать):
mmv '*ras.*' '#1#2'
Не забудьте использовать одинарные кавычки вокруг ваших шаблонов, в противном случае звезды будут расширяться на уровне оболочки.
Утилита не всегда доступна, но если это не так, вы можете установить ее с помощью:
sudo apt-get install mmv
Смотрите страницу руководства здесь .
Недавно мне пришлось сделать массовое переименование ряда файлов, где мне пришлось заменить последнее вхождение символа, когда этот символ встречался несколько раз в именах файлов. В этом конкретном случае мне пришлось заменить последнюю черту -на подчеркивание _, повернув это:
some-long-file-name.ext
в это:
some-long-file_name.ext
Это заняло некоторое время, но это, наконец, сделал это:
for FILE in *; do mv $FILE ${FILE%-*}_${FILE##*-}; done
Вот:
${i%-*} соответствует началу имени файла до последнего появления тире -${file##*-} соответствует остальной части имени файла после последнего появления тире -
ras, т.е. в конечном итогеsw..001, илиras., в результате чегоsw.001?