2009-07-09 73 views
2

我对进入bash脚本感兴趣,并希望知道如何遍历unix目录并将路径记录到当前正在查看的文件中,如果它符合正则表达式条件的话。如何使用bash或Perl脚本遍历目录树?

它会是这样的:

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

bash或Perl脚本都很好,但我更希望你将如何与grep的AWK等命令做到这一点使用bash脚本。

回答

5

使用发现和grep

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

-l上的grep得到的grep的只是文件名

-e指定一个正则表达式

{}地方的每个文件通过在find命令找到grep命令的末尾

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

+0

-exec grep会比较慢,因为它会分别为每个文件运行grep – 2009-07-09 10:12:24

+0

您可以用加号显着提高速度:find。 -exec grep -l -e'myregex'{} + >> outfile.txt – 2009-07-10 18:27:09

2

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

+0

-R在某些版本的Unix上给了我以前的问题。如果它适用于@Brock Woolf那么很好,否则,他将需要使用find和grep – Xetius 2009-07-09 09:52:43

8
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个文件

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

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

如果你想要做THI期从Perl中,你可以采取find命令,人们建议,并把它们变成一个Perl脚本find2perl

如果您有:

$ find ... 

做出

$ find2perl ... 

输出一个执行相同事情的Perl程序。从那里,如果你需要在Perl中做一些简单的事情,但是很难实现,你只需要扩展Perl程序。