代码之家  ›  专栏  ›  技术社区  ›  Grundlefleck anujkk

如何用Bash回显包含匹配文件的目录?

  •  30
  • Grundlefleck anujkk  · 技术社区  · 15 年前

    我想写一个bash脚本,它将使用包含特定文件的所有目录的列表。我可以用 find 回显每个匹配文件的路径。我只想列出至少包含一个匹配文件的目录的路径。

    例如,给定以下目录结构:

    dir1/
        matches1
        matches2
    dir2/
        no-match
    

    命令(正在查找 'matches*' )只将路径输出到 dir1 .

    作为额外的背景,我用它来查找每个包含Java.class文件的目录。

    6 回复  |  直到 15 年前
        1
  •  68
  •   Community CDub    4 年前
    find -name '*.class' -printf '%h\n' | sort -u
    

    从…起 man find :

    -printf 格式

    %h %小时 说明符扩展到 "."

        2
  •  32
  •   Community CDub    7 年前

    在…上 ,带有 find lacks the -printf option ,这将起作用:

    find . -name *.class -print0 | xargs -0 -n1 dirname | sort --unique
    

    -n1 xargs 将每次调用的从标准输入获取的最大参数数设置为1 dirname

        3
  •  7
  •   ghostdog74    15 年前

    find /root_path -type f -iname "*.class" -printf "%h\n" | sort -u
    
        4
  •  3
  •   bufh    10 年前

    好吧,我来的太晚了,但是您也可以不用find就完成,专门回答“matchingfilewithbash”(或者至少是posixshell)。

    ls */*.class | while read; do
      echo ${REPLY%/*}
    done | sort -u
    

    ${VARNAME%/*} 最后一次之后会把所有东西都剥光 / (如果你想在第一次之后把所有东西都脱光,那就太好了 ${VARNAME%%/*} ).

    当做

        5
  •  1
  •   Jim    15 年前
    find / -name *.class -printf '%h\n' | sort --unique
    
        6
  •  1
  •   davidqshull    7 年前

    我个人认为将文件夹列表打印到文件中比打印到终端(在Mac上)更有帮助。 为此,您只需使用以下命令将路径输出到文件,例如folders.txt:

    find . -name *.sql -print0 | xargs -0 -n1 dirname | sort --unique > folders.txt

        7
  •  1
  •   smac89    3 年前

    这个怎么样?

    find dirs/ -name '*.class' -exec dirname '{}' \; | awk '!seen[$0]++'
    

    awk 命令,请参见 #43 list