Copie recursivamente arquivos de um diretório para outro

11

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

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

no entanto, isso 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 -Rcopiar recursivamente todos os arquivos. Como posso alcançar esse objetivo?

kalenpw
fonte

Respostas:

19

Usar:

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

A razão para o seu comando não funciona é que os nomes que contêm caracteres especiais ( *.mp3) são expandidos antes do comando é executado, por isso, se você tivesse três arquivos ( 01.mp3, 02.mp3, 03.mp3) o 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 neste caso.

techraf
fonte
Eu recomendo, em -inamevez de -nameno caso de algum arquivo terminar .MP3.
Olathe
Obrigado, isso funcionou. Ou pelo menos está em processo de trabalho.
kalenpw
5

Você mencionou especificamente os arquivos / diretório (s) a serem copiados como usando *.mp3qualquer nome de arquivo / diretório que termine em .mp3.

Portanto, qualquer arquivo que termine em .mp3no /media/kalenpw/MyBook/Music/diretório e da mesma forma, qualquer diretório que termine .mp3em /media/kalenpw/MyBook/Music/será copiado recursivamente. Se não houver um arquivo / diretório correspondente, nada será copiado.

Agora, copie todos os .mp3arquivos do /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 {} +
    
heemail
fonte
Obrigado, o techraf respondeu primeiro, então aceitei a resposta deles.
kalenpw
1

Você também pode usar cpr :

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

Observe que sem o -p cpr preservará os caminhos completos do diretório nos nomes de arquivos copiados.
-rpode ser usado (em vez de -p) para preservar o caminho em '/media.../Music/'.
Também cprcuidará para que nenhum arquivo seja substituído, acrescentando um número começando em '0001' a qualquer nome de arquivo repetido copiado.

circulosmeos
fonte
0

Suponha que você tem um monte de .docx, .mp3, .txte .xlsxarquivos armazenados nesta estrutura de diretórios:

/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 você deseja recursar em todos esses diretórios para copiar todos os .mp3arquivos encontrados, /home/me/music/mas não deseja preservar essa árvore de diretórios no destino (ou seja, deseja que todos os .mp3arquivos encontrados sejam copiados para em /home/me/music/vez de copiados para os respectivos diretórios como /home/me/music/dir1/, /home/me/music/dir1/dir11/etc.).

Nesse caso, no terminal do shell (bash), execute primeiro este comando para acessar a raiz da sua pesquisa de arquivos:

cd /files

... e, em seguida, execute este comando:

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

No caso de você não quiser preservar árvore de diretórios do fonte no destino, execute este comando em vez (após a execução cd /files):

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

Nos comandos acima, a pesquisa não diferencia maiúsculas de minúsculas (por exemplo .mp3, correspondências .MP3, .mP3e .Mp3). Use em -namevez de -inamese desejar que a pesquisa faça distinção entre maiúsculas e minúsculas (por exemplo, usar -namepara a .mp3sequência de caracteres corresponderá aos arquivos que terminam com, .mp3mas não àqueles que terminam com .MP3, .mP3nem .Mp3).

Yuri Sucupira
fonte