【问题标题】:How to source all files in a directory? [duplicate]如何获取目录中的所有文件? [复制]
【发布时间】:2012-09-14 14:31:24
【问题描述】:

为什么这不起作用?

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

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

【问题讨论】:

    标签: bash


    【解决方案1】:

    当你运行. 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
    • 如果还想用find:while IFS= read -r -d $'\0' f; do echo "$f"; done < <(find . -maxdepth 1 -type f -print0)
    【解决方案2】:

    @Mat 的解决方案是最干净的,但是如果您对一些 bash-fu 感兴趣并从中获得乐趣,基于原始 find 命令的以下解决方案可以工作,太:

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

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

    【讨论】:

      猜你喜欢
      • 2013-08-09
      • 2017-08-20
      • 2014-10-27
      • 2016-03-07
      • 2014-02-18
      • 1970-01-01
      • 1970-01-01
      • 2020-08-29
      • 2017-10-27
      相关资源
      最近更新 更多