¿Cómo copiar todos los archivos de forma recursiva excluyendo carpetas en una carpeta de destino?

2

Tengo varias carpetas como /music/1/a.mp3 y /music/2/b.mp3

Todos los nombres de archivos en sí mismos están garantizados para ser diferentes.

¿Hay alguna manera, probablemente utilizando la Terminal, para copiar estos archivos a /musicTemp/ excluyendo las carpetas?

En otras palabras, el resultado de los dos ejemplos anteriores debe ser:

/music/1/a.mp3
/music/2/b.mp3

dentro:

/musicTemp/a.mp3
/musicTemp/b.mp3
samiles
fuente
2
¿Finder proporciona una opción para buscar archivos de forma recursiva? Si es así, busque, seleccione todo y arrástrelo a su destino. Sé que es una buena opción en otros sistemas operativos.
Ben Voigt
1
Eso es tan obvio que acabo de limpiar. Todos los archivos son .m4a y el Finder me permite limitar solo a / music /. ¡¡¡Gracias!!!
samiles
1
Solo para agregar una alternativa: find /music -name "*.mp3" -type file -exec mv {} /destination_dir \;
Hennes
2
@Hennes: cp no mv. De lo contrario, eso debería funcionar.
Ben Voigt

Respuestas:

4

los find El comando buscará todos los archivos del patrón especificado (-name), en este caso un tipo de archivo específico: *.mp3. -exec hace que todos los argumentos siguientes se encuentren para ser tomados como argumentos para el comando hasta que un argumento consistente en ; se encuentra (al final, con escape literal para evitar la expansión por parte del shell). En este caso, el comando que queremos ejecutar es una copia de archivo ( cp ) en archivos que coinciden con el patrón ( {} ) y copiar esos archivos a /destination_dir. Este comando debe hacer el truco:

find /music -name "*.mp3" -type file -exec cp {} /destination_dir \;
Dan
fuente
3

Si usted tiene Bash instalado 4 , podrias agregar shopt -s globstar a .bash_profile y ejecute esto:

cp /music/**/*.mp3 /musicTemp/
Lri
fuente
No estoy seguro de que shopt.. Es necesario ya que esto funciona sin modificaciones, también con mv.. Gracias de todos modos el ** es nuevo para mi :)
geotheory