Як відповідь на моє попереднє запитання , якщо у мене є кілька файлів форми
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
?