Copie recursivamente archivos de un directorio a otro

11

Tengo toda mi música en una carpeta /media/kalenpw/MyBook/Music/ABunchOfOtherFoldersWithFilesInside. Quiero copiar todos los mp3 a, /media/kalenpw/HDD/Musicasí que usé:

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

sin embargo, esto solo copió los mp3 en la carpeta de música raíz y no abrió ninguno de los subdirectorios del artista y no copió esos archivos.

Tenía la impresión de -Rque copiaría recursivamente todos los archivos. ¿Cómo puedo lograr dicho objetivo?

kalenpw
fuente

Respuestas:

19

Utilizar:

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

La razón de su comando no funciona es que los nombres que contienen caracteres comodín ( *.mp3) se expanden antes de que el comando se ejecuta, así que si tenía tres archivos ( 01.mp3, 02.mp3, 03.mp3) de su mando efectivo fue:

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 puede ver -Rno tiene ningún efecto en este caso.

techraf
fuente
Recomiendo en -inamelugar de -nameen caso de que algún archivo termine .MP3.
Olathe
Gracias esto funcionó. O al menos está en proceso de trabajar.
kalenpw
5

Usted ha mencionado específicamente los archivos / directorio (s) que se copiarán utilizando, *.mp3es decir, cualquier nombre de archivo / directorio que termine en .mp3.

Por lo que cualquier archivo con extensión .mp3en el /media/kalenpw/MyBook/Music/directorio y del mismo modo, cualquier directorio que termina en .mp3en /media/kalenpw/MyBook/Music/se copiará, de forma recursiva. Si no existe un archivo / directorio coincidente, no se copiará nada.

Ahora para copiar todos los .mp3archivos de /media/kalenpw/MyBook/Music/recursivley al directorio /media/kalenpw/HDD/Music/:

  • Utilizando bash:

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

    find /media/kalenpw/MyBook/Music -type f -name '*.mp3' -exec cp -at /media/kalenpw/HDD/Music {} +
    
heemayl
fuente
Gracias, techraf respondió primero, así que acepté su respuesta, sin embargo.
kalenpw
1

También puedes usar cpr :

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

Tenga en cuenta que sin -p cpr conservará las rutas de directorio completas en los nombres de archivos copiados.
-rse puede usar (en lugar de -p) para preservar la ruta en '/media.../Music/'.
También cprse ocupará de que no se sobrescriba ningún archivo, agregando un número que comience en '0001' a cualquier nombre de archivo repetido copiado.

circulosmeos
fuente
1

Supongamos que usted tiene un montón de .docx, .mp3, .txty .xlsxarchivos almacenados en esta estructura de directorios:

/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/

... y desea recurrir a todos esos directorios para copiar todos los .mp3archivos encontrados , /home/me/music/pero no desea conservar dicho árbol de directorios en el destino (es decir, desea que todos los .mp3archivos encontrados se copien en /home/me/music/lugar de copiarse en los directorios respectivos tales como /home/me/music/dir1/, /home/me/music/dir1/dir11/etcétera).

En tal caso, en el terminal de shell (bash) primero ejecute este comando para acceder a la raíz de su búsqueda de archivos:

cd /files

... y luego ejecuta este comando:

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

En caso de que no desea conservar árbol de directorios de la fuente en el destino, ejecute este comando en su lugar (después de correr cd /files):

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

En los comandos anteriores, la búsqueda no distingue entre mayúsculas y minúsculas (es decir .mp3, coincidencias .MP3, .mP3y .Mp3). Use en -namelugar de -inamesi desea que la búsqueda distinga entre mayúsculas y minúsculas (por ejemplo, usar -namepara la .mp3cadena de caracteres coincidirá con los archivos que terminan en, .mp3pero no con los que terminan con .MP3, .mP3ni .Mp3).

Yuri Sucupira
fuente
Para el caso en el que desea preservar la estructura del directorio, ejecute este comando desde el directorio de origen. Si ejecuta find /source/dir -iname '*.mp3' | cpio -pdm /home/me/music/, creará / home / me / music / source / dir y los archivos se copiarán en esta nueva ubicación.
Gautam