如何将目录(及其子目录)中的所有pdf文件递归地复制到单个输出目录中?


20

我有一个包含大量PDF文件的目录,其中一些文件位于子目录中(该子目录可以扩展几层深)。我想将所有匹配的文件移动*.pdf到名为的单个输出文件夹中papers

我怎样才能做到这一点?


1
如果有两个文件a/x.pdf,您要如何处理b/x.pdf
Panic Panic 2012年

Answers:



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

这是我做的测试

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

./a:
foo.pdf

./pdfs:

注意文件“ aaa bbb.pdf”。

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

./a:

./pdfs:
aaa bbb.pdf  foo.pdf

美丽!+1!
PenguinCoder 2012年

您不需要引用"{}"来处理包含空格的文件名吗?
terdon 2012年

@terdon:实际上,不,您不知道(尽管有时这种问题确实会让我失望)。查看最新答案。
RedGrittyBrick 2012年

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

(类似于另一个答案,但我更喜欢pipe / xargs / mv ...对我来说更直观)

仅供参考,我在多个目录和多个pdf文件上成功完成了上述单行脚本。


1
xargs具有-exec没有的“文件名中的空格”问题。您可以通过-print0在您的查找内容和-0xargs中添加args 来进行某种程度的中介。
Rich Homolka 2012年

@RichHomolka看到改变的答案。(感谢小费。这确实有用!)
Trevor Boyd Smith

你曾经尝试过吗?看起来您需要在find命令的末尾添加“ -print0”
tollo

0

对于Windows命令行(cmd.exe),可以使用:

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

1
您好,欢迎来到SU。感谢您的回答,但该问题专门要求Linux解决方案。
terdon 2012年

2
Windows还能做到这一点仍然令人赞叹!
Vorac 2012年

0

如果只搜索一个目录,则可以执行以下操作:

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

其中<destination>代表一些目录。mv不会自动为您创建目录。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.