як я можу перейменувати кілька файлів, видаливши символ чи рядок?


21

Як відповідь на моє попереднє запитання , якщо у мене є кілька файлів форми

sw.ras.001
sw.ras.002
sw.ras.003
…

Яку команду можна використовувати для видалення ras.середини всіх файлів?


Ви хочете видалити лише те ras, тобто закінчити sw..001або ras.залишити sw.001?
Кевін

я, мабуть, хотів би видалити 'ras'. чи була б команда зовсім іншою?
Пол

Ні, лише те, чи включаєте ви \.в шаблони.
Кевін

Відповіді:


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.