Copia ricorsivamente i file da una directory all'altra


11

Ho tutta la mia musica in una cartella /media/kalenpw/MyBook/Music/ABunchOfOtherFoldersWithFilesInside. Voglio copiare tutti gli mp3 /media/kalenpw/HDD/Musiccosì ho usato:

cp -R /media/kalenpw/MyBook/Music/*.mp3 /media/kalenpw/HDD/Music

tuttavia questo ha solo copiato gli mp3 nella cartella della musica di root e non ha aperto nessuna delle sottodirectory dell'artista e ha copiato quei file.

Avevo l'impressione di -Rcopiare in modo ricorsivo tutti i file. Come posso raggiungere questo obiettivo?

Risposte:


19

Uso:

find /media/kalenpw/MyBook/Music/ -name '*.mp3' -exec cp {} /media/kalenpw/HDD/Music \;

Il motivo per il vostro comando non funziona è che i nomi contenenti caratteri jolly ( *.mp3) sono espanse prima che il comando viene eseguito, quindi se si aveva tre file ( 01.mp3, 02.mp3, 03.mp3) il vostro comando efficace è stato:

cp -R /media/kalenpw/MyBook/Music/01.mp3 /media/kalenpw/MyBook/Music/02.mp3 /media/kalenpw/MyBook/Music/03.mp3 /media/kalenpw/HDD/Music

Come puoi vedere -Rnon ha alcun effetto in questo caso.


Raccomando -inameinvece -namenel caso in cui un file finisca .MP3.
Olathe,

Grazie ha funzionato. O almeno è in procinto di funzionare.
Kalenpw,

5

Hai menzionato in modo specifico i file / le directory / i da copiare come utilizzando, ad *.mp3esempio, qualsiasi nome di file / directory che termina con .mp3.

Quindi, qualsiasi file con estensione .mp3nella /media/kalenpw/MyBook/Music/directory e allo stesso modo, qualsiasi directory che termina in .mp3in /media/kalenpw/MyBook/Music/verrà copiato, in modo ricorsivo. Se non esiste un file / directory corrispondente, non verrà copiato nulla.

Ora per copiare tutti i .mp3file da /media/kalenpw/MyBook/Music/ricursivley alla directory /media/kalenpw/HDD/Music/:

  • Utilizzando bash:

    shopt -s globstar
    cp -at /media/kalenpw/HDD/Music /media/kalenpw/MyBook/Music/**/*.mp3
    
  • Utilizzando find:

    find /media/kalenpw/MyBook/Music -type f -name '*.mp3' -exec cp -at /media/kalenpw/HDD/Music {} +
    

Grazie, Techraf ha risposto per primo, quindi ho accettato la loro risposta, comunque.
Kalenpw,

1

Puoi anche usare cpr :

$ cd /media/kalenpw/HDD/Music
$ cpr -p '/\.mp3$/' '/media/kalenpw/MyBook/Music/'

Notare che senza -p cpr manterrà i percorsi di directory completi sui nomi dei file copiati.
-rpuò essere utilizzato (anziché -p) per conservare il percorso in '/media.../Music/'.
Si cproccuperà inoltre che nessun file venga sovrascritto, aggiungendo un numero che inizia con '0001' a qualsiasi nome di file ripetuto copiato.


1

Si supponga di avere un po 'di .docx, .mp3, .txte .xlsxfile memorizzati in questa struttura di directory:

/files/
/files/dir1/
/files/dir1/dir11/
/files/dir1/dir12/
/files/dir1/dir13/
/files/dir2/
/files/dir3/
/files/dir3/dir31/
/files/dir3/dir32/
/files/dir4/
/files/dir5/
/files/dir51/
/files/dir52/
/files/dir53/
/files/dir54/

... e si desidera ricorrere a tutte queste directory per copiare tutti i .mp3file trovati /home/me/music/ma non si desidera preservare tale albero di directory nella destinazione (cioè si desidera .mp3copiare tutti i file trovati /home/me/music/anziché copiarli nelle rispettive directory come /home/me/music/dir1/, /home/me/music/dir1/dir11/eccetera).

In tal caso, sul terminale della shell (bash) eseguire prima questo comando per accedere alla radice della ricerca dei file:

cd /files

... e quindi esegui questo comando:

for i in `find . -iname '*.mp3'`; do cp $i /home/me/music/; done

Nel caso in cui non desidera conservare albero di directory della sorgente nella destinazione, eseguire questo comando al posto (dopo l'esecuzione cd /files):

find . -iname '*.mp3' | cpio -pdm /home/me/music/

Sui comandi di cui sopra, la ricerca è case-insensitive (cioè le partite .mp3, .MP3, .mP3e .Mp3). Utilizzare -nameinvece di -inamese si desidera che la ricerca faccia distinzione tra maiuscole e minuscole (ad esempio, l'utilizzo -nameper la .mp3stringa di caratteri corrisponderà ai file che terminano con, .mp3ma non a quelli che terminano con .MP3, .mP3.Mp3).


Nel caso in cui si desideri preservare la struttura della directory, eseguire questo comando dalla directory di origine. Se corri find /source/dir -iname '*.mp3' | cpio -pdm /home/me/music/, creerà / home / me / music / source / dir e i file verrebbero copiati in questa nuova posizione.
Gautam,
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.