Як я можу перейменувати багато файлів за допомогою регулярного вираження?


20

Я хочу перейменувати багато файлів на Mac OS X (10.7.2). У мене немає пакета perl для renameкоманди.

Мої файли мають назви типу "T452-102456-0.png", і я хочу видалити частину "-0". Я знаю, що можу зробити цю дію, написавши власний сценарій php-cli, але хотів би знати про простіше і швидше рішення.


Чи не існує логічного протиріччя між "великою кількістю файлів pdf" та "Моїми файлами такі назви, як" T452-102456-0.png ""?
манатура

О ... тип файлів не має значення, але це правда ^^. Редагую, дякую за Ваш коментар =)
Рафаель

Відповіді:


21

Bash або Ksh разом з mvможуть вирішити це:

for f in *.png; do mv -n "$f" "${f/-0}"; done

У випадку, якщо ім'я файлу може мати "0" і після першого тире, а "-0" завжди знаходиться перед крапкою, ви можете включити цю точку у вираз:

for f in *.png; do mv -n "$f" "${f/-0./.}"; done

Але , як правило , що перейменування просто, якщо у вас є renameвід Util-Linux пакет, який буде робити це теж:

rename '-0.' '.' *.png

він працює чудово. Дуже дякую =)
Рафаель

3

Простий метод: Файли лише в поточному каталозі

З zsh:

autoload zmv
zmv '(*)-0(.png)' '$1$2'

З іншими оболонками:

for x in *-0.png; do mv -- "$x" "${x%-0.*}.png"; done


Удосконалений метод: Файли в поточному каталозі та / або підкаталогах

З zsh:

zmv '(**/)(*)-0(.png)' '$1$2$3'

З ksh93:

set -o globstar
for x in **/*-0.png; do mv -- "$x" "${x%-0.*}.png"; done

З bash ≥4, як вище, але використовуйте shopt -s globstarзамість setкоманди.

З іншими оболонками:

find -name '*-0.png' -exec sh -c 'for x; do mv -- "$x" "${x%-0.*}.png"; done' _ {} +

ще одна чудова причина встановити zsh:) .... zmv
danidee


0

Якщо у вас є mmvпакет:

mmv '*-0.png' '#1.png'

Як і (останні версії) rename, це обережно обережно уникатиме перезапису існуючих файлів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.