2009-07-10 16 views
80

Ho un paio di directory e sottodirectory contenenti file senza estensione di file. Voglio aggiungere .jpg a tutti i file contenuti in queste directory. Ho visto gli script di bash per cambiare l'estensione del file ma non per aggiungerne solo uno. Deve anche essere ricorsivo, qualcuno può aiutare per favore?ricorsivamente aggiungere l'estensione di file a tutti i file

risposta

176

comando alternativo senza un ciclo esplicito (man find):

find . -type f -exec mv '{}' '{}'.jpg \; 

Spiegazione: questo trova ricorsivamente tutti i file (-type f) a partire dalla directory corrente (.) e si applica il comando di spostamento (mv) a ciascuno dei loro. Si noti anche le virgolette intorno {}, in modo che i nomi dei file con gli spazi (e anche a capo ...) sono adeguatamente trattati.

+6

In particolare, questo funziona meglio se ci sono un numero enorme di file nella struttura della directory (causando l'irritazione di bash sulla lunghezza della lista di file da iterare). – DrAl

+0

@Al, se si fa riferimento a un ciclo di sovrascrittura 'for' per iterare su un elenco di file, questo non è corretto. Il loop '' for' iterativamente emette ogni comando 'mv'. – nik

+0

Domanda: 'find' prima imposta un elenco di file * prima * esegue l'istruzione' -exec'? Credo di sì, ma voglio chiarire questo punto prima di codificare loop infiniti. – Boldewyn

4

come questo,

for f in $(find . -type f); do mv $f ${f}.jpg; done 

Non mi aspetto di avere i nomi dei file separati da spazi,
Se lo fai, dovrà essere elaborato un po 'i nomi.

Se si desidera eseguire il comando da qualche altra directory,
è possibile sostituire il find . con find /target/directory.

+1

Questo manca un 'fare' e se ci sono spazi nel nome del file, si può meglio citare il nome del file: for f in $; (find -type f.) fai mv "$ f" "$ {f} .jpg"; fatto – DrAl

+0

e presumibilmente lo avrei eseguito dalla directory di primo livello? – robjmills

+0

@seengee: si. Nota che questo comando manca anche il trattino in '-type'. – Stephan202

49

questo sarà trovare i file senza estensione e aggiungere il .jpg

find /path -type f -not -name "*.*" -exec mv "{}" "{}".jpg \; 
+6

+1 perché salta i file che hanno già un'estensione. – Stephan202

+0

Questo fornirà sicuramente il risultato desiderato il 99% delle volte. +1 – les

0

rename

non sono sicuro che si può rinominare i file senza estensioni (sono su Windows 7 in questo momento)

+1

può, ma rinominerà anche le directory, e non c'è modo di dirgli di lavorare in modo ricorsivo nelle sottodirectory (almeno con la versione che ho su Ubuntu). – mirod

+0

Conosco almeno due diversi comandi chiamati "rename", uno un programma C incluso in util-linux-ng e uno un programma Perl (di Wall stesso) sulle macchine Debian della nostra università. In realtà nessuno di questi due fa la ricorsione. – Boldewyn

9

Questo è un po 'tardi, ma ho pensato che vorrei aggiungere che una soluzione migliore (anche se forse meno leggibile) di quelli finora potrebbe essere:

find /path -type f -not -name "*.*" -print0 | xargs -0 rename 's/(.)$/$1.jpg/' 

Utilizzando il modello find | xargs si traduce generalmente in esecuzione più efficiente, in quanto non si dispone di sborsare un nuovo processo per ogni file.

Si noti che questo richiede la versione di rinomina si trovano in distribuzioni Debian-aromatizzato (aka prename), piuttosto che la ridenominazione tradizionale. È solo un piccolo script perl, quindi, sarebbe abbastanza facile usare il comando precedente su qualsiasi sistema.

0

Per rinominare tutti i file senza estensione a base di Windows si può fare ren * *.jpg Poiché il file come alcuna estensione, basta usare il *, oppure se si desidera modificare png a jpg uso ren *.png *.jpg

Problemi correlati