2

我有兴趣进入 bash 脚本,并想知道如何遍历 unix 目录并记录当前正在查看的文件的路径(如果它与正则表达式条件匹配)。

它会是这样的:

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

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

4

6 回答 6

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

于 2009-07-09T10:16:35.763 回答
5

使用 find 和 grep

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

-l在 grep 上只获取文件名

-e在 grep 上指定一个正则表达式

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

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

于 2009-07-09T09:40:46.583 回答
2

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

于 2009-07-09T09:42:23.587 回答
2

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

如果你有:

$ find ...

做那个

$ find2perl ...

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

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

类似的线程

于 2009-07-09T11:27:32.280 回答
0
find /path -type f -name "outfile.txt" | awk '
{
    while((getline line<$0)>0){
        if(line ~ /pattern/){
            print $0":"line
        }
    }    
}'
于 2009-07-09T11:28:48.207 回答