Rinominare più file sostituendo un particolare pattern nei nomi dei file usando uno script di shell

Scrivi un semplice script che rinominerà automaticamente un numero di file. Ad esempio, vogliamo che il file * 001.jpg sia rinominato come stringa definita dall’utente + 001.jpg (es: MyVacation20110725_001.jpg) L’utilizzo di questo script è quello di ottenere che le foto della fotocamera digitale abbiano nomi di file che abbiano un senso.

Ho bisogno di scrivere uno script di shell per questo. Qualcuno può suggerire come iniziare?

Un esempio per aiutarti a decollare.

for f in *.jpg; do mv "$f" "$(echo "$f" | sed s/IMG/VACATION/)"; done 

In questo esempio, presumo che tutti i file immagine inizino con “IMG” e che tu voglia sostituire “IMG” con “VACATION”.

La shell valuta automaticamente *.jpg in tutti i file corrispondenti.

Il secondo argomento di mv (il nuovo nome del file) è l’output del comando sed che sta sostituendo “IMG” con “VACATION”.

Se i nomi dei file includono più spazi consecutivi, prestate particolare attenzione alla notazione "$f" . Hai bisogno di virgolette per conservare tali spazi.

È ansible utilizzare l’utilità di rinomina per rinominare più file in base a un modello. Ad esempio, il comando seguente imposterà stringa MyVacation2011_ a tutti i file con estensione jpg.

 rename 's/^/MyVacation2011_/g' *.jpg 

o

 rename    
 for file in *.jpg ; do mv $file ${file//IMG/myVacation} ; done 

Di nuovo supponendo che tutti i file di immagine abbiano la stringa “IMG” e si desideri sostituire “IMG” con “myVacation”.

Con bash puoi convertire direttamente la stringa con l’ espansione dei parametri .

Esempio: se il file è IMG_327.jpg, il comando mv verrà eseguito come se fossi mv IMG_327.jpg myVacation_327.jpg . E questo sarà fatto per ogni file trovato nella directory corrispondente a *.jpg .

IMG_001.jpg -> myVacation_001.jpg
IMG_002.jpg -> myVacation_002.jpg
IMG_1023.jpg -> myVacation_1023.jpg
eccetera…

questo esempio, presumo che tutti i file di immagine inizino con “IMG” e che tu voglia sostituire “IMG” con “VACATION”

soluzione: prima identificato tutti i file jpg e quindi sostituire la parola chiave

 find . -name '*jpg' -exec bash -c 'echo mv $0 ${0/IMG/VACATION}' {} \; 

Puoi provare questo:

 for file in *.jpg; do mv $file $somestring_${file:((-7))} done 

Puoi vedere “espansione dei parametri” in man bash per capire meglio sopra.

Un’altra opzione è:

 for i in *001.jpg do echo "mv $i yourstring${i#*001.jpg}" done 

rimuovi l’ echo dopo averlo corretto.

La sostituzione dei parametri con # manterrà solo l’ultima parte, quindi puoi cambiarne il nome.

 find . -type f | sed -n "s/\(.*\)factory\.py$/& \1service\.py/p" | xargs -p -n 2 mv 

per esempio rinominerà tutti i file nel cwd con nomi che terminano in “factory.py” per essere sostituiti con nomi che terminano in “service.py”

spiegazione:

1) nel cmd sed, il flag -n sopprimerà il comportamento normale dell’ecoing dell’input all’output dopo l’applicazione del comando s /// e l’opzione p su s /// imporrà la scrittura sull’output se viene effettuata una sostituzione. dal momento che un sottotitolo verrà creato solo sulla partita, sed avrà solo output per i file che terminano in “factory.py”

2) nella stringa s /// di sostituzione, usiamo “&” per interpolare l’intera stringa di corrispondenza, seguita da un carattere di spazio, nella sostituzione. per questo motivo, è fondamentale che la nostra RE corrisponda all’intero nome file. dopo lo space char, usiamo “\ 1service.py” per interpolare la stringa che abbiamo inghiottito prima di “factory.py”, seguito da “service.py”, sostituendolo. Quindi per trasformazioni più complesse devi cambiare gli argomenti in s /// (con un re ancora corrispondente all’intero nome del file)

esempio di output:

 foo_factory.py foo_service.py bar_factory.py bar_service.py 

3) usiamo xargs con -n 2 per consumare l’output di stringhe delimitate sed 2 alla volta, trasmettendole a mv (ho anche messo l’opzione -p lì dentro in modo che tu possa sentirti sicuro durante l’esecuzione di questo). Ecco.

Non posso commentare la risposta di Susam Pal, ma se hai a che fare con gli spazi, circonderei di citazioni:

 for f in *.jpg; do mv "$f" "`echo $f | sed s/\ /\-/g`"; done;