Come rinominare più file sostituendo la parola nel nome del file?


36

Sostituire ACDC in AC-DC

Ad esempio abbiamo questi file

ACDC - Rock N 'Roll Ain't Noise Pollution.xxx

ACDC - Rocker.xxx

ACDC - Spara a Thrill.xxx

Voglio che diventino:

AC-DC - Rock N 'Roll Ain't Noise Pollution.xxx

AC-DC - Rocker.xxx

AC-DC - Spara a Thrill.xxx

So che sed o awk viene utilizzato per questa operazione. Non posso google nulla, quindi sto chiedendo il tuo aiuto =) Potresti fornire il comando di shell funzionante per questa attività?

Feedback: soluzione per utenti OSX


1
Sento che c'è una domanda più grande qui - stai cercando di sistemare i nomi dei file mp3 in generale? Ci sono un certo numero di script che le persone hanno scritto nel corso degli anni per farlo. Penso che uno che ho usato sia stato chiamato mp3fixer.
Phil Hollenback il

no, non riguarda gli mp3, devo solo gestire alcuni file di grandi dimensioni con nomi simili, e qualcosa deve essere sostituito o riparato ... situazione comune, quindi ho bisogno di questa elegante soluzione per rinominarli tutti
holms

Risposte:


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

a partire dal 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.

Ad esempio, per rinominare tutti i file corrispondenti a "* .bak" per eliminare l'estensione, si potrebbe dire

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

Per tradurre in maiuscolo i nomi in maiuscolo, devi usare

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

5
Si noti che molte macchine linux hanno la rinomina da util-linux, che implementa una semplice sostituzione, non regex. Quindi se la ridenominazione fallisce silenziosamente senza fare nulla, probabilmente stai usando lo sbaglio rename.
Phil Hollenback il

Lo stavo cercando da anni! thnx!
holms

@PhilHollenback Come trovare / installare quello giusto allora? :)
henry

Non funziona quando ho caratteri di sottolineatura nei nomi dei file anziché negli spazi: come posso risolverlo?
unfa

13

Questa risposta contiene le parti buone di tutte le altre risposte, tralasciando tale eresia ls | while read.

Directory attuale:

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

Comprese le sottodirectory:

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

Caratteri di nuova riga sono davvero improbabile che sia nei nomi dei file, quindi questo può essere più semplice, pur lavorando con nomi contenenti spazi:

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

9

Per usare la versione util-linux di renamequel Phil cui si fa riferimento (su Ubuntu, si chiama rename.ul):

rename ACDC AC-DC ACDC*

o

rename.ul ACDC AC-DC ACDC*

1
la tua variante è la migliore =) così tanti articoli stupidi su google su trovare e inviare e awk ... a questa semplice operazione per la quale già rinominato egxist!
holms

4

Usando la shell 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

Nota: l'utilizzo findelaborerà la directory corrente e le directory in.


1

Dipende dalla tua shell. In zsh, farei questo:

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

Probabilmente non è la soluzione migliore, ma funziona.


1

Usando bash:

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

Se hai installato il renameprogramma:

rename 's/ACDC/AC-DC/' *.xxx
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.