使用find命令排除子目录

这个问题在这里已经有了答案:

  • 如何在find中排除目录。 命令32个答案

  • 继我之前的评论之后,这对我的Debian有效:

    find . -path ./ignored_directory -prune -o -name fileName.txt -print
    

    要么

    find /path/to/folder -path "*/ignored_directory" -prune -o -name fileName.txt -print
    

    要么

    find /path/to/folder -name fileName.txt -not -path "*/ignored_directory/*"
    

    这里的区别很好地辩论


    为了补充olivm的有用答案,并在需要-o解决OP的困惑:

  • -prune ,因为每个find主要(操作或测试,在GNU说),返回一个布尔值,并且在-prune的情况下该布尔值总是为true
  • 没有明确的运营商,初选被隐式地与连接-a-and ),其中,像它的兄弟-o-or )执行短路布尔逻辑。
  • -a-o具有更高的优先级。
  • 有关所有find概念的摘要,请参阅https://stackoverflow.com/a/29592349/45375

    因此, 接受的答案

    find . -path ./ignored_directory -prune -o -name fileName.txt -print
    

    相当于 (括号用于使评估优先级明确):

    find . ( -path ./ignored_directory -a -prune ) 
           -o 
           ( -name fileName.txt -a -print )
    

    由于短路适用,评估如下:

  • 匹配./ignored_directory的输入路径导致-prune被评估; 由于-prune总是返回true ,所以短路会阻止对-o操作符的右侧进行评估; 实际上,没有任何事情发生(输入路径被忽略)
  • 输入路径不匹配./ignored_directory ,即刻 - 再次由于短路 - 继续在-o右侧进行评估:
  • 只有当输入路径的文件名部分与fileName.txt匹配时,才是评估的-print主要; 实际上,只会打印文件名与fileName.txt匹配的输入路径。
  • 编辑 :尽管我最初在这里声称, -print IS在-o的右侧需要这里; 没有它,隐含的-print将应用于整个表达式,因此也打印左侧的匹配; 请参阅下面的背景信息。


    相比之下,让我们考虑错误地不使用-o

    find . -path ./ignored_directory -prune -name fileName.txt -print
    

    这相当于:

    find . -path ./ignored_directory -a -prune -a -name fileName.txt -a -print
    

    这只会打印修剪后的路径(也与-name过滤器匹配),因为-name-print -name与(逻辑)AND(隐式)连接;
    在这种特定情况下,由于./ignored_directory不能与fileName.txt匹配,因此不会打印任何内容,但如果-path的参数是glob,则可能会得到输出。


    关于find一个词隐式使用-print

    POSIX强制要求,如果find命令的表达式作为整体不包含任何一个

  • 生产产品的初选,如-print本身
  • 执行某些操作的初选,例如-exec-ok
  • (给出的实例原色是穷举的POSIX的规范。的find ,但现实世界的实施中,如GNU find和BSD find添加其他的,例如,作为输出产生-print0初级,且执行-execdir主)
  • 那么隐式应用-print ,就好像该表达式被指定为:

    ( expression ) -print

    这很方便,因为它可以让你编写诸如find .命令find . ,而无需追加-print

    但是,在某些情况下,需要显式-print ,如下所示:

    假设我们没有在接受的答案末尾指定-print

    find . -path ./ignored_directory -prune -o -name fileName.txt
    

    由于表达式中不存在输出或执行初级,所以它被评估为:

    find . ( -path ./ignored_directory -prune -o -name fileName.txt ) -print
    

    这不会按预期工作,因为如果整个括号表达式的计算结果为true,则会打印路径,在这种情况下,错误地包含修剪后的目录。

    相比之下,通过将-print明确地附加到-o分支,只有在-o表达式的右侧计算为true时才会打印路径; 使用括号使逻辑更清晰:

    find . -path ./ignored_directory -prune -o ( -name fileName.txt -print )
    

    相反,如果左侧为真,则只执行-prune ,不会产生任何输出(并且由于整个表达式包含-print-print不会隐式应用)。


    编辑 (添加行为规范细节)

    在find中修剪所有权限被拒绝的目录

    使用gnufi​​nd。

    规范行为细节 - 在这个解决方案中,我们希望:

  • 排除不可读的目录内容(修剪它们),
  • 避免来自不可读目录的“权限被拒绝”错误,
  • 保持其他错误并返回状态,但是
  • 处理所有文件(如果我们可以读取他们的名字,甚至是不可读的文件)
  • 基本的设计模式是:

    find ...  ( -readable -o -prune ) ...
    

    find /var/log/ ( -readable -o -prune ) -name "*.1" 
    

    {感谢} mklement0

    链接地址: http://www.djcxy.com/p/78123.html

    上一篇: Excluding subdirectories using the find command

    下一篇: Exclude a directory from find linux