Come posso ricorsivamente copiare tutti i file pdf in una directory (e le sue sottodirectory) in una singola directory di output?


20

Ho una directory che contiene un gran numero di file PDF, alcuni dei quali si trovano in sottodirectory (che possono estendere diversi livelli in profondità). Vorrei spostare tutti i file corrispondenti *.pdfin una singola cartella di output denominata papers.

Come posso fare questo?


1
Come vorresti gestire il caso ci sono due file a/x.pdfe b/x.pdf?
Colonnello Panic,

Risposte:



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

Ecco un test che ho fatto

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

./a:
foo.pdf

./pdfs:

Si noti il ​​file "aaa bbb.pdf".

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

./a:

./pdfs:
aaa bbb.pdf  foo.pdf

Bellissimo! +1!
PenguinCoder

Non hai bisogno di citare "{}"per gestire i nomi dei file contenenti spazi?
terdon,

@terdon: in realtà no, non lo fai (anche se quel tipo di problema mi sorprende a volte). Vedi la risposta aggiornata.
RedGrittyBrick,

4
find -print0 /directory/with/pdfs -iname "*.pdf" | xargs -0 mv -t /papers

(simile a un'altra risposta ma preferisco pipe / xargs / mv ... più intuitivo per me)

Cordiali saluti, ho fatto lo script di una riga sopra riportato con successo su più directory e più file pdf.


1
xargs ha il problema di "spazi nei nomi di file" che -exec non ha. Puoi mediarlo in qualche modo aggiungendo args -print0alla tua ricerca e -0a xargs.
Rich Homolka,

@RichHomolka vedi risposta modificata. (Grazie per la punta. È davvero utile!)
Trevor Boyd Smith,

L'hai mai provato? Sembra che tu debba aggiungere "-print0" alla fine del comando find
tollo

0

Per la riga di comando di Windows (cmd.exe), è possibile utilizzare:

for /F "usebackq delims==" %j IN (`dir /s /b *.pdf`) do copy "%j" c:\target_dir

1
Ciao e benvenuto a SU. Grazie per la tua risposta, ma la domanda richiede specificamente una soluzione Linux.
Terdon

2
È ancora meraviglioso che anche Windows possa farlo!
Vorac,

0

Se stai cercando solo una directory in profondità, puoi fare:

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

dove <destination> sta per qualche directory. mvnon creerà automaticamente una directory per te.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.