Linux用户!我遇到了一个问题:我在 directory 中有所有 pdf 文件Downloads,但我希望它复制 subfolder 中的所有文件\Download\BOOKS\。我将如何使用for循环复制所有文件?
for files in ...
不是 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)
现有的答案都不错,但有不同的小问题,可能有问题也可能没有问题。让我们尝试处理它们。
*.pdf正确的所有文件?我发现从互联网上下载的 PDF 通常是这样的*.PDF。(我怀疑某些不区分大小写的文件系统会导致这种情况。)BOOKS/Romance,BOOKS/Horror例如。该策略是用于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循环来复制文件。您可以使用以下方法复制文件:
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)