Як перейменувати кілька файлів, замінивши слово у назві файлу?


36

Замініть ACDC на змінного струму

Наприклад, у нас є ці файли

ACDC - Rock N 'Roll не забруднює шумом.xxx

ACDC - Rocker.xxx

ACDC - Shoot To Thrill.xxx

Я хочу, щоб вони стали:

AC-DC - Rock N 'Roll не забруднює шумом.xxx

AC-DC - Rocker.xxx

AC-DC - Зйомка в Thrill.xxx

Я знаю, що sed або awk використовується для цієї операції. Я нічого не можу google, тому я прошу вашої допомоги =) Чи можете ви, будь ласка, надати повну робочу команду оболонки для цього завдання?

Відгук: рішення для користувачів OSX


1
Я маю на увазі, що тут є більш велике запитання - ти взагалі намагаєшся виправити mp3-файли? Існує ряд сценаріїв, які люди написали протягом багатьох років для цього. Я думаю, один з них я називався mp3fixer.
Філ Холленбек

немає , це не про mp3, я просто повинен управляти деякими величезні файли зі схожими іменами, і що - то все повинно бути замінено або фіксованого ... загальну ситуацію , так що мені потрібно це витончене рішення для перейменування всіх з них
Holms

Відповіді:


45
rename 's/ACDC/AC-DC/' *.xxx

з man rename

DESCRIPTION
       "rename" renames the filenames supplied according to the rule specified as the 
first argument.  The perlexpr argument is a Perl expression which is expected to modify the 
$_ string in Perl for at least some of the filenames specified.  If a given filename is not 
modified by the expression, it will not be renamed.  If no filenames are given on
           the command line, filenames will be read via standard input.

Наприклад, ви можете перейменувати всі файли, що відповідають "* .bak", щоб зняти розширення

rename 's/\.bak$//' *.bak

Щоб перевести великі імена в нижню, ви використовуєте

rename 'y/A-Z/a-z/' *

5
Зауважте, що багато машин Linux надходять із перейменуванням від util-linux, який реалізує просту заміну, а не регулярні вирази. Тож якщо перейменування не вдається безшумно, не роблячи нічого, ви, ймовірно, використовуєте неправильно rename.
Філ Холленбек

Я шукав це століттями! thnx!
homs

@PhilHollenback Як знайти / встановити потрібний тоді? :)
Генрі

Це не працює, якщо у моїх іменах замість пробілів є підкреслення - як я можу це вирішити?
несправедливий

13

Ця відповідь містить хороші частини від усіх інших відповідей, залишаючи при цьому таку єресь, як ls | while read.

Поточний каталог:

for file in ACDC*.xxx; do
    mv "$file" "${file//ACDC/AC-DC}"
done

Включаючи підкаталоги:

find . -type f -name "ACDC*" -print0 | while read -r -d '' file; do
    mv "$file" "${file//ACDC/AC-DC}"
done

Символи нового рядка дійсно навряд чи будуть вживати імена файлів, тому це може бути простішим під час роботи з іменами, що містять пробіли:

find . -type f -name "ACDC*" | while read -r file; do
    mv "$file" "${file//ACDC/AC-DC}"
done

9

Для використання версії util-linux renameзазначеного Філа (в Ubuntu це називається rename.ul):

rename ACDC AC-DC ACDC*

або

rename.ul ACDC AC-DC ACDC*

1
ваш варіант найкращий =) стільки дурних статей в Google про пошук і надіслати і просити ... до цієї простої операції, для якої вже перейменуйте egxist!
homs

4

Використання оболонки bash

find . -type f -name "ACDC*" -print0 | while read -d $'\0' f
do
   new=`echo "$f" | sed -e "s/ACDC/AC-DC/"`
   mv "$f" "$new"
done

Примітка: використання findбуде обробляти поточний каталог та каталоги під.


1

Залежить від вашої оболонки. У zsh я зробив би це:

for file in ACDC*.xxx; do
    mv "$file" "$(echo $file | sed -e 's/ACDC/AC-DC/')"
done

Напевно, не найкраще рішення, але працює.


1

Використання bash:

ls *.xxx | while read fn; do
    mv "${fn}" "${fn/ACDC/AC-DC}";
done

Якщо у вас встановлена renameпрограма:

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