我正在尝试在bash脚本中运行类似于以下命令的命令。它应搜索的所有子文件夹,$sourcedir
并将特定类型的所有文件复制到的根级别$targetdir
。
#!/bin/bash
# These are set as arguments to the script, not hard-coded
sourcedir="/path/to/sourcedir"
targetdir="/path/to/targetdir"
find "$sourcedir" -type f -name "*.type" -exec sh -c 'cp "$1" "$2/`basename "$1"`"' "{}" "$targetdir" \;
这似乎很接近,除了{}
没有传递$2
给-exec sh -c ...
我希望这样做尽可能接近“正确的方式”,并允许对文件名中的特殊字符(特别是单引号字符)进行容忍。
编辑:我看到有人建议使用xargs
或参数链。我的印象是,这仅适用于有限数量的参数。例如,如果我有成千上万个.jpg文件,我正试图将它们从许多画廊目录中复制到一个巨大的幻灯片目录中,则解决方案链接参数仍然有效吗?
编辑2:我的问题是我_
在-exec
命令中的第一个选项sh之前缺少。对于任何对如何使find命令起作用感到好奇的人,添加_
,一切都会好起来的:
find "$sourcedir" -type f -name "*.type" -exec sh -c 'cp "$1" "$2"' _ "{}" "$targetdir" \;
我下面接受了一个答案,因为它可以完成相同的任务,但是效率更高且更优雅。
xargs
创建它来自动处理具有限制的常规命令上的大量参数的原因。还需要考虑的是,大多数max参数限制已针对标准GNU utils进行了极大改进。您还将看到性能上的好处,避免了所有那些涉及数千个文件的进程分叉。