Copiar recursivamente arquivos de um diretório para outro

4

Eu tenho todas as minhas músicas em uma pasta /media/kalenpw/MyBook/Music/ABunchOfOtherFoldersWithFilesInside . Eu quero copiar todos os mp3s para /media/kalenpw/HDD/Music , então eu usei:

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

no entanto, isto apenas copiou os mp3s na pasta de música raiz e não abriu nenhum dos subdiretórios do artista e copiou esses arquivos.

Eu estava com a impressão de que -R iria recursivamente copiar todos os arquivos. Como posso alcançar o objetivo?

    
por kalenpw 24.07.2016 / 06:03

2 respostas

10

Uso:

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

O motivo pelo qual o comando não está funcionando é que os nomes contendo curingas ( *.mp3 ) são expandidos antes do comando ser executado, portanto, se você tiver três arquivos ( 01.mp3 , 02.mp3 , 03.mp3 ), seu comando efetivo foi:

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

Como você pode ver, -R não tem efeito nesse caso.

    
por techraf 24.07.2016 / 06:06
4

Você mencionou especificamente que o (s) arquivo (s) / diretório (s) deve (m) ser copiado (s) usando *.mp3 , ou seja, qualquer nome de arquivo / diretório terminado em .mp3 .

Portanto, qualquer arquivo que termine no diretório .mp3 in /media/kalenpw/MyBook/Music/ e, da mesma forma, qualquer diretório terminado em .mp3 in /media/kalenpw/MyBook/Music/ será copiado, recursivamente. Se não houver nenhum arquivo / diretório correspondente, nada será copiado.

Agora, copie todos os arquivos .mp3 de /media/kalenpw/MyBook/Music/ recursivley para o diretório /media/kalenpw/HDD/Music/ :

  • Usando bash :

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

    find /media/kalenpw/MyBook/Music -type f -name '*.mp3' -exec cp -at /media/kalenpw/HDD/Music {} +
    
por heemayl 24.07.2016 / 06:11