Как продолжение моего предыдущего вопроса , если у меня есть несколько файлов в форме
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
?