Come posso trovare solo i file * .mp3 con un comando ricorsivo come ls -R *.mp3in una directory che contiene diverse sottodirectory e alla fine copiare questi file in una directory che ho scelto.
Grazie per il vostro sostegno.
Come posso trovare solo i file * .mp3 con un comando ricorsivo come ls -R *.mp3in una directory che contiene diverse sottodirectory e alla fine copiare questi file in una directory che ho scelto.
Grazie per il vostro sostegno.
Risposte:
Il comando è:
find /path/to/directory -name "*.mp3" -exec cp {} /some/other/dir/ \;
Alternativa:
find /path/to/dir/ -name '*.mp3' | xargs cp -t /target/
Esempio:
alex@MaD-pc:~/test$ ls
1 2 3
alex@MaD-pc:~/test$ ls 1 2 3
1:
1.txt 2.mp3 3.txt
2:
4.txt 5.mp3 6.txt
3:
alex@MaD-pc:~/test$ find . -name "*.mp3" -exec cp {} 3/ \;
alex@MaD-pc:~/test$ ls 3
2.mp3 5.mp3
Per maggiori informazioni:
man find
xargsè normalmente molto più veloce. Ho appena eseguito un rapido test qui per trovare un carico di file c ed eseguirli ls -l. Sono 0m2.420s xargse 0m25.494s per -exec... Chiaramente in questo caso l' cpoperazione richiederà la maggior parte del tempo, quindi probabilmente non importa ma vale la pena prenderne nota.
-n`` switch to the comando cp` per evitare la sovrascrittura nel caso di nomi duplicati (o scrivere uno script che controlli i duplicati prima di copiare e rinominare il bersaglio come necessario)
C'è anche un altro modo per farlo, che penso si adatterà perfettamente al tuo scopo. È possibile combinare findcon un whileciclo e non è nemmeno necessario utilizzare uno execo xargstutti. Se, ad esempio, volessi copiare il tuo mp3sdalla cartella di download nella cartella della tua musica, utilizzeresti il seguente script, che ho usato molte volte.
Puoi modificarlo come vuoi cambiando le directory che cercano finde inseriscono i file risultanti; se non viene indicata alcuna directory, findcercherà l'intera cartella home. È inoltre possibile modificare cpa mvo di altri comandi. È abbastanza veloce, poiché l'ho appena testato con 3945 .jpgfile! Copialo in un editor di testo, salvalo e quindi eseguilo eseguendolo chmod +x myscript.
#!/bin/bash
# a script to recursively find and copy files to a desired location
find ~/Downloads -type f -iname '*.mp3' -print0 |
while IFS= read -r -d '' f;
do cp -- "$f" ~/Music ;
done
In questo noto Bash wiki viene mostrato quanto sia utile combinare il whileciclo e i readcomandi per elaborare l'output del findcomando; e il modo in cui l'ho fatto si assicura che lo script non si rompa se incontra nomi di file con spazi o altri caratteri imprevisti o speciali.
Per informazioni più generali sul findcomando, accedere al terminale man findo consultare le manpage di Ubuntu online . Per un'ottima introduzione all'uso di find, leggi anche questo articolo .
find ~/Downloads -type f -iname '*.mp3' | while read mp3file; do cp "$mp3file" ~/Music; donesemplice?
-n`` switch to the comando cp` per evitare la sovrascrittura nel caso di nomi duplicati (o scrivere uno script che controlli i duplicati prima di copiare e rinominare il bersaglio come necessario)
find /path/to/dir/ -name '*.c' | xargs cp -t /target/