Come posso cercare i file in tutte le sottodirectory usando la shell e quindi copiarli?


8

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:


14

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

I giudici accetterebbero anche:find /path/to/dir/ -name '*.c' | xargs cp -t /target/
Oli

Sono uno dei giudici e nego questa soluzione Cool Grazie per il commento, lo aggiungerò :)
hytromo

1
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.
Oli

Consiglierei di aggiungere il -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)
Anziano Geek,

2

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 .


non è più find ~/Downloads -type f -iname '*.mp3' | while read mp3file; do cp "$mp3file" ~/Music; donesemplice?
steabert

Il mio metodo rappresenta la migliore pratica e impedisce la rottura dello script, come notato nel link che ho citato.

ah, vedo, che si occupa della gestione dei caratteri speciali, grazie per il link :)
steabert

Consiglierei di aggiungere il -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)
Anziano Geek,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.