【发布时间】:2012-09-14 14:31:24
【问题描述】:
为什么这不起作用?
find . -maxdepth 1 -type f -print0 | xargs -0 .
我得到的只是xargs: .: Permission denied。
【问题讨论】:
标签: bash
为什么这不起作用?
find . -maxdepth 1 -type f -print0 | xargs -0 .
我得到的只是xargs: .: Permission denied。
【问题讨论】:
标签: bash
当你运行. file 时,你调用了一个内置的shell .。您的 xargs 变体尝试执行当前目录。
即使确实调用了内置命令,该命令也会在子 shell 中运行,因此所有“采购”都是无用的。
为此使用 shell globbing 和循环:
for file in * ; do
if [ -f "$file" ] ; then
. "$file"
fi
done
【讨论】:
xargs 一起使用(以及 find 的 -exec 主函数)。这是等效的单行代码:for f in *; do [[ -f "$f" ]] && . "$f"; done
while IFS= read -r -d $'\0' f; do echo "$f"; done < <(find . -maxdepth 1 -type f -print0)
@Mat 的解决方案是最干净的,但是如果您对一些 bash-fu 感兴趣并从中获得乐趣,基于原始 find 命令的以下解决方案可以工作,太:
eval $(find . -maxdepth 1 -type f -exec echo . \'{}\'';' \;)
find 与 -exec 一起使用,为找到的每个文件构造一个源命令,例如. './foo';。请注意转义的单引号以确保文件名具有特殊字符。处理得当。find 将返回一个以换行符分隔的采购命令列表;通过使用命令替换 ($())没有双引号,shell 将这些行折叠成一行,每行使用一个空格作为分隔符。eval 在当前 shell 的上下文中执行完整的源命令列表(在 OS X 10.8.1 上验证)。注意:此解决方案的一个潜在问题是命令字符串可能会变大 - 可能太大 - 存在许多文件和/或长文件名。
【讨论】: