¿Cómo puedo copiar recursivamente todos los archivos pdf en un directorio (y sus subdirectorios) en un único directorio de salida?

20

Tengo un directorio que contiene una gran cantidad de archivos PDF, algunos de los cuales están en subdirectorios (que pueden extenderse varias capas de profundidad). Me gustaría mover todos los archivos que coincidan *.pdfen una sola carpeta de salida llamada papers.

¿Cómo puedo hacer esto?

blz
fuente
1
¿Cómo le gustaría manejar el caso de que haya dos archivos a/x.pdfy b/x.pdf?
Coronel Panic

Respuestas:

30
  find /bunchopdfs -name "*.pdf" -exec mv {} /papers \;    

Aquí hay una prueba que hice

$ ls -R
.:
a  aaa bbb.pdf  pdfs

./a:
foo.pdf

./pdfs:

Observe el archivo "aaa bbb.pdf".

$ find . -name "*pdf" -exec mv {} pdfs \;
$ ls -R
.:
a  pdfs

./a:

./pdfs:
aaa bbb.pdf  foo.pdf
RedGrittyBrick
fuente
¡Hermosa! +1!
PenguinCoder
¿No necesita comillas "{}"para tratar con nombres de archivos que contienen espacios?
terdon
@terdon: En realidad, no, no lo haces (aunque ese tipo de problema me atrapa a veces). Ver respuesta actualizada.
RedGrittyBrick
4
find -print0 /directory/with/pdfs -iname "*.pdf" | xargs -0 mv -t /papers

(similar a otra respuesta pero prefiero pipe / xargs / mv ... más intuitivo para mí)

Para su información, hice el script de una línea anterior con éxito en varios directorios y múltiples archivos pdf.

Trevor Boyd Smith
fuente
1
xargs tiene el problema de "espacios en los nombres de archivo" que -exec no tiene. Puede mediar esto un poco agregando args -print0a su búsqueda y -0xargs.
Rich Homolka
@RichHomolka ver la respuesta cambiada. (Gracias por la sugerencia. ¡Eso es realmente útil!)
Trevor Boyd Smith
¿Has probado eso alguna vez? Parece que necesita agregar el "-print0" al final del comando de búsqueda
tollo
0

Para la línea de comandos de Windows (cmd.exe), puede usar:

for /F "usebackq delims==" %j IN (`dir /s /b *.pdf`) do copy "%j" c:\target_dir
JackyBill
fuente
1
Hola y bienvenido a SU. Gracias por su respuesta, pero la pregunta solicita específicamente una solución de Linux.
terdon
2
¡Todavía es maravilloso que Windows también pueda hacer eso!
Vorac
0

Si solo busca en un directorio profundo, puede hacer:

mkdir <destination>
mv */*.pdf <destination>

donde <destination>representa algún directorio. mvno creará automáticamente un directorio para usted.

Kevin Dong
fuente