![查找并执行 bsub < 多个文件](https://linux22.com/image/175454/%E6%9F%A5%E6%89%BE%E5%B9%B6%E6%89%A7%E8%A1%8C%20bsub%20%3C%20%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6.png)
我打算查找*.lsf
当前的内容/subdirectories
并执行bsub<*.lsf
所有查找文件。我试过:
find ./ -type f -name "*.lsf" -exec bsub < \;
该部分find ./ -type f -name "*.lsf"
工作正常。然而,执行部分却出现了问题。
有谁能帮忙解答一下吗?
答案1
你的第一次尝试就已经接近成功了。您需要做的是调用 shell 来解析<
重定向运算符
find -name '*.lsf' -exec bash -c 'bsub <"$1"' _ {} \;
但是,这不是很有效,因为您现在正在为每个匹配的文件启动一个 shell。尽可能少地调用 shell 并使用循环一次处理多个文件
find -name '*.lsf' -exec bash -c 'for i in "$@"; do bsub <"$i"; done' _ {} +
这两个都是文件名安全的(即它们处理文件名中的空格和非打印/半打印字符)。
答案2
您可以与xargs
:
find ./ -type f -name "*.lsf" | xargs bsub
事实上,您可以将孔缩短为:
find *.lsf | xargs bsub
评论:在我使用的集群上进行了测试。
编辑:删除了替换字符串选项和重定向字符。
答案3
xargs
以有效的方式使用, 。 (请注意,正如 @KamilMaciorowski 所说,这是不安全的。)
find . -type f -iname "*.lsf" | xargs -I {} bash -c 'cat < {}'
然后修复文件名空间等
find . -type f -iname "*.lsf" -print0 | xargs -0 -I {} bash -c 'cat < {}'
我测试过cat
。你必须用你的命令替换