我想将所有pdf文件复制到另一个目录中

and*_*čič 2 copy

Linux用户!我遇到了一个问题:我在 directory 中有所有 pdf 文件Downloads,但我希望它复制 subfolder 中的所有文件\Download\BOOKS\。我将如何使用for循环复制所有文件?

for files in ...

Kev*_*vin 9

不是 for 循环,但这应该可以移动文件。

mv /home/username/Downloads/*.pdf /home/username/Downloads/BOOKS
Run Code Online (Sandbox Code Playgroud)

使用它来制作文件的副本

cp /home/username/Downloads/*.pdf /home/username/Downloads/BOOKS
Run Code Online (Sandbox Code Playgroud)


stu*_*dog 7

现有的答案都不错,但有不同的小问题,可能有问题也可能没有问题。让我们尝试处理它们。

  1. *.pdf正确的所有文件?我发现从互联网上下载的 PDF 通常是这样的*.PDF。(我怀疑某些不区分大小写的文件系统会导致这种情况。)
  2. BOOKS 子目录中的所有PDF 都是直接的,还是有子目录?BOOKS/RomanceBOOKS/Horror例如。
  3. PDF 是否有文件扩展名?有时他们不会。
  4. 是否有任何文件以符号方式链接?不太可能,但不难处理。
  5. 已经指出但需要重复:是否有任何文件名包含空格或其他奇怪的字符?空格对于人类可读性来说相当普遍。

该策略是用于find定位潜在的 PDF,file仅过滤实际的 PDF,然后对这些文件名进行操作。

find -L books -maxdepth 1 -print0 | xargs -0 -n1 -I{} sh -c '[ "$(file -b --mime-type "{}")" = "application/pdf" ] && cp "{}" Download/'
Run Code Online (Sandbox Code Playgroud)

find -L Download/BOOKS -maxdepth 1 -print0将在从 开始的子目录树中定位所有文件系统条目,Download/BOOKS如果需要,跟随符号链接,到最大深度。增加深度数以处理子目录,或删除-maxdepth 1以处理整个树。

xargs -0 -n1 -I{} 接受多行输入并使用 1 个输入行重复运行命令。

sh -c '[ "$(file -b --mime-type "{}")" = "application/pdf" ] && cp "{}" Download/'创建一个新的 shell 来对文件系统条目运行测试,如果它是 PDF(由文件扩展名和文件内容确定),则将其复制到Download/目录中。

Usingfind处理 1., 2. 和 4. Usingfile处理 3. 使用-print0and-0参数和仔细引用处理 5.

如果你真的需要一个循环,因为你想在每个 PDF 上运行其他命令,cp "{}" Download/用任何合适的替换。这{}是一个模式,xargs 在运行时将替换为每个文件名。


小智 5

我不知道 for 循环(除非你编写一个 C 程序来实现这一点),但这一行应该这样做:

 cp -v ~/Downloads/*.pdf ~/Downloads/BOOKS/
Run Code Online (Sandbox Code Playgroud)

CP 是副本,* 用于通配符以选择该目录中以 .pdf 结尾的任何内容。

  • 我打算列出所有具有 for 循环的语言(Bash、sh、python),但列出这里没有的语言要容易得多: (3认同)
  • @Sam 有很多语言没有 for 循环。例如,Scheme 和 Haskell。 (2认同)

Kul*_*lfy 5

我不认为你需要for循环来复制文件。您可以使用以下方法复制文件:

cp /home/username/Downloads/*.pdf /home/username/Downloads/BOOKS
Run Code Online (Sandbox Code Playgroud)

但是如果你仍然想使用for循环,你也可以写下面的代码:

cd /home/username/Downloads
for F in *.pdf
do
   cp "$F" /home/username/Downloads/BOOKS
done
Run Code Online (Sandbox Code Playgroud)

  • @DougO'Neal:此处列出的代码工作正常。Glob 随后不会进行分词。喜欢就试试吧。 (4认同)
  • 如果文件名包含空格,则 for 循环不起作用。 (2认同)