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
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.
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
.
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
e presumibilmente lo avrei eseguito dalla directory di primo livello? – robjmills
@seengee: si. Nota che questo comando manca anche il trattino in '-type'. – Stephan202
questo sarà trovare i file senza estensione e aggiungere il .jpg
find /path -type f -not -name "*.*" -exec mv "{}" "{}".jpg \;
+1 perché salta i file che hanno già un'estensione. – Stephan202
Questo fornirà sicuramente il risultato desiderato il 99% delle volte. +1 – les
rename
non sono sicuro che si può rinominare i file senza estensioni (sono su Windows 7 in questo momento)
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
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
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.
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
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
@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
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