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

时间:2009-07-09 09:38:17

标签: perl bash unix directory traversal

我对进入bash脚本感兴趣,并且想知道如何遍历unix目录并记录当前正在查看的文件的路径,如果它符合正则表达式标准。

会是这样的:

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

Bash或Perl脚本很好,但我更喜欢使用带有 grep awk 等命令的bash脚本来执行此操作。

6 个答案:

答案 0 :(得分:8)

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

重要部分:

  • -type 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个文件

答案 1 :(得分:5)

使用find和grep

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

-l只获取文件名

grep上的

-e指定正则表达式

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

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

答案 2 :(得分:2)

grep -l -R <regex> <location>应该完成这项工作。

答案 3 :(得分:2)

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

如果你有:

$ find ...

制作

$ find2perl ...

输出一个执行相同操作的Perl程序。从那里开始,如果你需要在Perl中做一些简单但在shell中很难的东西,你只需要扩展Perl程序。

答案 4 :(得分:0)

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

类似thread

答案 5 :(得分:0)

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