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
- 1. .gitignore ignora tutti i file quindi consente ricorsivamente * .foo
- 2. NSIS - Come copiare ricorsivamente escludendo i file?
- 3. Xcode - predefinito per aggiungere nuovi file a tutti i target
- 4. Aggiungere tutti i file non verificati a SVN
- 5. Come decomprimere i file ricorsivamente in Java?
- 6. jGit - come aggiungere tutti i file all'area di staging
- 7. Groovy (File IO): trovare tutti i file e restituire tutti i file - il modo Groovy
- 8. Git: commit e aggiungere automaticamente tutti i file non monitorate
- 9. Cosa si espande ricorsivamente in tutti i file nella directory corrente?
- 10. Impossibile aggiungere file a TFS
- 11. Come aggiungere tutti i file in un set di file come argomento per l'attività exec?
- 12. Elenca tutti i file ResourceBundle
- 13. git checkout tutti i file
- 14. Aggiungere righe a un file
- 15. Applicazione di un'opzione a tutti i file aperti in Vim
- 16. impostare una configurazione Git ricorsivamente per tutti i sottomoduli
- 17. Aggiungi tutti i file non tracciati contemporaneamente
- 18. File batch di Windows - Concatena tutti i file nelle sottodirectory
- 19. JQuery - richiama tutti i nomi di file dentro input = 'file'
- 20. visualizzare tutti i file di default
- 21. Come aggiungere il file .plist a tutti i target in XCode?
- 22. ftp PhpStorm senza scaricare tutti i file
- 23. Come aggiungere estensione .xml a tutti i file in una cartella in Unix/Linux
- 24. Batch rinominare in OSX, aggiungere @ 2x a tutti i file che terminano con .png
- 25. Aggiungere tutti i file senzaversione a Subversion usando un comando Linux
- 26. directory ricorsivamente Elimina a Scala
- 27. ColdFusion cfstatic include tutti i file CSS
- 28. Elenco ricorsivo di tutti i file corrispondenti a un determinato tipo di file in Groovy
- 29. Camminare ricorsivamente in un albero di directory e elencare i nomi di file
- 30. aprire più nomi di file in tkinter e aggiungere i nomi di file a un elenco
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