【问题标题】:Exclude a certain directory while (find command) - BASH [duplicate]在(查找命令)时排除某个目录 - BASH [重复]
【发布时间】:2019-10-08 07:54:27
【问题描述】:

这个 Bash 脚本遍历 /app 目录中的每个文件。

这是树的层次结构

/app
_/a
-/b
-/test/unittest/python/test.py

问题是,我不想执行 lint 步骤。 如何排除测试目录?

...
for file in $(find /app -name '*.py'); do
        filename=$(basename $file)
        if [[ $filename != "__init__.py" ]] ; then
                echo "$file"
                pylint "${file}" --rcfile="${lint_path}" || exit 1
        fi
done

这是一种解决问题的方法,不确定是否正确。不工作!

$(find /app -name '*.py' -not -path '*test*')

【问题讨论】:

  • 顺便说一句,for anything in $(find ...)一般来说是不好的做法。请参阅DontReadLinesWithFor 了解原因(简短形式:它会破坏完全合法的文件名),以及UsingFind 以了解替代方案(特别是使用-print0-exec 的那些做法,两者都可以通过所有可能的名称正确)。
  • 类似地,filename=$(basename $file) 本身会因为未加引号的扩展而使用空格或可扩展的通配符来破坏名称。 filename=$(basename "$file") 更安全,尽管完全删除 basename 并使其成为 filename=${file##*/} 同样正确且执行速度更快;请参阅 BashFAQ #100 描述使用的语法。

标签: bash


【解决方案1】:

使用-prune 选项防止下降到test 目录。

您也可以在find 中排除__init__.py,这样您就无需使用if 进行测试。

$(find /app -type d -name test -prune -o -type f -name '*.py' ! -name '__init__.py' -print)

【讨论】:

  • 您会考虑删除命令替换语法(或接受这样做的编辑)吗?这样,答案同样准确,但不再展示不良做法。
  • 对我来说这是超级外星人代码。但这真的很好用
  • @Barmar 先生。我把我的工作从全栈工程师换成了 devops 工程师。我正在努力学习 bash 脚本。是否有任何资源或最佳实践来学习 bash 脚本???这对我来说并不像 python 脚本那么简单。 :(
  • @JohnBaek,BashGuide 是一个很好的资源,bash-hackers' wiki 也是如此。一般参见StackOverflow bash tag wiki 中的链接;我明确建议反对使用的唯一一件事(实际上,可能不再存在)是来自 TLDP 的资源。另请参阅 BashFAQBashPitfalls 页面。
  • @JohnBaek 我确定有教程,但我没有任何建议。
猜你喜欢
  • 2015-06-27
  • 2017-05-14
  • 2018-12-15
  • 2011-05-06
  • 2018-12-11
  • 2021-01-02
  • 2015-12-16
  • 2011-12-29
  • 2016-01-20
相关资源
最近更新 更多