9

为什么这不起作用?

find . -maxdepth 1 -type f -print0 | xargs -0 .

我得到的只是xargs: .: Permission denied

4

2 回答 2

17

当你运行时. file,你调用了一个内置的 shell .。您的xargs变体尝试执行当前目录。
即使确实调用了内置命令,该命令也会在子 shell 中运行,因此所有“采购”都是无用的。

为此使用 shell globbing 和循环:

for file in * ; do
  if [ -f "$file" ] ; then
    . "$file"
  fi
done
于 2012-09-14T14:35:58.017 回答
1

@Mat 的解决方案是最干净的,但如果您对一些 bash-fu 感兴趣,可以使用以下基于原始find命令的解决方案:

eval $(find . -maxdepth 1 -type f -exec echo . \'{}\'';' \;)
  • find用于-exec为找到的每个文件构造一个采购命令,例如. './foo';. 请注意转义的单引号以确保文件名具有特殊字符。得到妥善处理。
  • find将返回一个以换行符分隔的采购命令列表;通过使用不带$()双引号的命令替换 ( ) ,shell 将这些行折叠成一行,并使用每个空格作为分隔符。
  • 最后,eval在当前 shell 的上下文中执行源命令的完整列表(在 OS X 10.8.1 上验证)。

注意:此解决方案的一个潜在问题是命令字符串可能会变大 - 可能太大 - 存在许多文件和/或长文件名。

于 2012-09-14T17:39:04.937 回答