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