代码之家  ›  专栏  ›  技术社区  ›  Brock Woolf

如何使用bash或perl脚本遍历目录树?

  •  2
  • Brock Woolf  · 技术社区  · 15 年前

    我对bash脚本很感兴趣,想知道如何遍历一个unix目录,并记录当前正在查看的文件的路径,看它是否符合regex标准。

    它应该是这样的:

    • 遍历大型UNIX目录路径文件/文件夹结构。
    • 如果当前文件 内容 包含与一个或多个regex表达式匹配的字符串,
    • 然后将文件的完整路径附加到结果文本文件。

    bash或perl脚本很好,不过我更喜欢使用bash脚本 格雷普 , AWK 等命令。

    6 回复  |  直到 15 年前
        1
  •  5
  •   Xetius    15 年前

    使用查找和grep

    find . -exec grep -l -e 'myregex' {} \; >> outfile.txt
    

    -l 在grep上只得到文件名

    -e 在grep上指定一个regex

    {} 将find命令找到的每个文件放在grep命令的末尾

    >> outfile.txt 附加到文本文件

        2
  •  8
  •   user80168    15 年前
    find . -type f -print0 | xargs -0 grep -l -E 'some_regexp' > /tmp/list.of.files
    

    重要部分:

    • -类型F使查找列表仅限于文件
    • -print0打印的文件不是由\n分隔的,而是由\0分隔的-这里是为了确保在文件名中包含空格的情况下可以正常工作
    • xargs-0-拆分\0上的输入,并将每个元素作为参数传递给您提供的命令(本例中为grep)

    使用xargs很酷的一点是,如果您的目录真的包含很多文件,那么您可以通过并行处理来加快处理速度:

    find . -type f -print0 | xargs -0 -P 5 -L 100 grep -l -E 'some_regexp' > /tmp/list.of.files
    

    这将在5个单独的副本中运行grep命令,每个副本扫描另一组多达100个文件

        3
  •  2
  •   pgs    15 年前

    grep -l -R <regex> <location> 应该做这个工作。

        4
  •  2
  •   brian d foy    15 年前

    如果您想在Perl中执行此操作,可以使用 find 人们建议的命令,并将其转换为Perl脚本 find2perl :

    如果你有:

    $ find ...
    

    做那个

    $ find2perl ...
    

    它输出执行相同操作的Perl程序。从这里开始,如果您需要做一些在Perl中容易但在Shell中难的事情,您只需扩展Perl程序。

        5
  •  0
  •   Community Mr_and_Mrs_D    7 年前
    find /path -type f -name "*.txt" | awk '
    {
        while((getline line<$0)>0){
            if(line ~ /pattern/){
                print $0":"line
                #do some other things here
            }
        }    
    }'
    

    类似的 thread

        6
  •  0
  •   joe    15 年前
    find /path -type f -name "outfile.txt" | awk '
    {
        while((getline line<$0)>0){
            if(line ~ /pattern/){
                print $0":"line
            }
        }    
    }'