Comment puis-je copier récursivement tous les fichiers pdf d'un répertoire (et de ses sous-répertoires) dans un seul répertoire de sortie?

20

J'ai un répertoire contenant un grand nombre de fichiers PDF, dont certains sont dans des sous-répertoires (qui peuvent s'étendre sur plusieurs couches). Je voudrais déplacer tous les fichiers correspondants *.pdfdans un seul dossier de sortie nommé papers.

Comment puis-je faire ceci?

blz
la source
1
Comment aimeriez-vous gérer le cas où il y a deux fichiers a/x.pdfet b/x.pdf?
Colonel Panic,

Réponses:

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

Voici un test que j'ai fait

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

./a:
foo.pdf

./pdfs:

Notez le fichier "aaa bbb.pdf".

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

./a:

./pdfs:
aaa bbb.pdf  foo.pdf
RedGrittyBrick
la source
Magnifique! +1!
PenguinCoder
Vous n'avez pas besoin de citer "{}"pour traiter les noms de fichiers contenant des espaces?
terdon
@terdon: En fait, non, vous ne le faites pas (bien que ce genre de problème me rattrape parfois). Voir la réponse mise à jour.
RedGrittyBrick
4
find -print0 /directory/with/pdfs -iname "*.pdf" | xargs -0 mv -t /papers

(similaire à une autre réponse mais je préfère pipe / xargs / mv ... plus intuitif pour moi)

Pour info, j'ai fait le script d'une ligne ci-dessus avec succès sur plusieurs répertoires et plusieurs fichiers pdf.

Trevor Boyd Smith
la source
1
xargs a le problème des "espaces dans les noms de fichiers" que -exec n'a pas. Vous pouvez arbitrer quelque peu cela en ajoutant des arguments -print0à votre recherche et -0à xargs.
Rich Homolka
@RichHomolka voir la réponse modifiée. (Merci pour l'astuce. C'est vraiment utile!)
Trevor Boyd Smith
Avez-vous déjà essayé ça? Il semble que vous devez ajouter le "-print0" à la fin de la commande find
tollo
0

Pour la ligne de commande Windows (cmd.exe), vous pouvez utiliser:

for /F "usebackq delims==" %j IN (`dir /s /b *.pdf`) do copy "%j" c:\target_dir
JackyBill
la source
1
Salut et bienvenue à SU. Merci pour votre réponse, mais la question demande spécifiquement une solution Linux.
terdon
2
C'est toujours merveilleux que les fenêtres puissent faire ça aussi!
Vorac
0

Si vous ne recherchez qu'un seul répertoire en profondeur, vous pouvez faire:

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

<destination>représente un répertoire. mvne créera pas automatiquement de répertoire pour vous.

Kevin Dong
la source