¿Cómo puedo encontrar solo los archivos * .mp3 con un comando recursivo como ls -R *.mp3
en un directorio que contiene varios subdirectorios y, al final, copiar estos archivos en un directorio que yo elija.
Gracias por su apoyo.
fuente
¿Cómo puedo encontrar solo los archivos * .mp3 con un comando recursivo como ls -R *.mp3
en un directorio que contiene varios subdirectorios y, al final, copiar estos archivos en un directorio que yo elija.
Gracias por su apoyo.
El comando es:
find /path/to/directory -name "*.mp3" -exec cp {} /some/other/dir/ \;
Alternativa:
find /path/to/dir/ -name '*.mp3' | xargs cp -t /target/
Ejemplo:
alex@MaD-pc:~/test$ ls
1 2 3
alex@MaD-pc:~/test$ ls 1 2 3
1:
1.txt 2.mp3 3.txt
2:
4.txt 5.mp3 6.txt
3:
alex@MaD-pc:~/test$ find . -name "*.mp3" -exec cp {} 3/ \;
alex@MaD-pc:~/test$ ls 3
2.mp3 5.mp3
Para más información:
man find
También hay otra forma de hacerlo que creo que se adaptará perfectamente a su propósito. Puede combinarse find
con un while
bucle y ni siquiera necesita usar ninguno exec
o ninguno xargs
. Si, por ejemplo, quisiera copiar su mp3s
archivo de descarga a su carpeta de música, usaría el siguiente script, que he usado muchas veces.
Puede modificarlo como desee cambiando los directorios que find
busca y coloca los archivos resultantes; si no se indica ningún directorio, find
buscará en toda la carpeta de inicio. También puede cambiar cp
a mv
u otros comandos. ¡Es bastante rápido, ya que lo acabo de probar con 3945 .jpg
archivos! Cópielo en un editor de texto, guárdelo y luego hágalo ejecutable ejecutando chmod +x myscript
.
#!/bin/bash
# a script to recursively find and copy files to a desired location
find ~/Downloads -type f -iname '*.mp3' -print0 |
while IFS= read -r -d '' f;
do cp -- "$f" ~/Music ;
done
En este wiki Bash señalado se muestra lo útil que es combinar el while
bucle y los read
comandos para procesar la salida del find
comando; y la forma en que lo he hecho asegura que el script no se rompa si se encuentra con nombres de archivos con espacios u otros caracteres inesperados o especiales.
Para obtener información más general sobre el find
comando, ingrese en el terminal man find
o consulte las páginas de manual de Ubuntu en línea . Para una gran introducción al uso de find, vea también este artículo .
find ~/Downloads -type f -iname '*.mp3' | while read mp3file; do cp "$mp3file" ~/Music; done
más simple?
-n`` switch to the
comando cp` para evitar sobrescribir en el caso de nombres duplicados (o escribir un script que busque duplicados antes de copiar y renombrar el objetivo según sea necesario)
find /path/to/dir/ -name '*.c' | xargs cp -t /target/
xargs
Normalmente es mucho más rápido. Acabo de ejecutar una prueba rápida aquí para encontrar una carga de archivos c y ejecutarlosls -l
en ellos. Son 0m2.420s paraxargs
y 0m25.494s para-exec
... Claramente en este caso lacp
operación tomará la mayor parte del tiempo, por lo que probablemente no importe, pero vale la pena tenerlo en cuenta.-n`` switch to the
comando cp` para evitar sobrescribir en el caso de nombres duplicados (o escribir un script que busque duplicados antes de copiar y renombrar el objetivo según sea necesario)