我有兴趣进入 bash 脚本,并想知道如何遍历 unix 目录并记录当前正在查看的文件的路径(如果它与正则表达式条件匹配)。
它会是这样的:
- 遍历一个大的 unix 目录路径文件/文件夹结构。
- 如果当前文件的内容包含匹配一个或多个正则表达式的字符串,
- 然后将文件的完整路径附加到结果文本文件中。
Bash 或 Perl 脚本很好,尽管我更喜欢使用带有grep、awk等命令的 bash 脚本来执行此操作。
find . -type f -print0 | xargs -0 grep -l -E 'some_regexp' > /tmp/list.of.files
重要部分:
使用 xargs 很酷的一点是,如果您的目录包含很多文件,您可以通过并行处理来加快进程:
find . -type f -print0 | xargs -0 -P 5 -L 100 grep -l -E 'some_regexp' > /tmp/list.of.files
这将在 5 个单独的副本中运行 grep 命令,每个副本扫描另一组最多 100 个文件
使用 find 和 grep
find . -exec grep -l -e 'myregex' {} \; >> outfile.txt
-l
在 grep 上只获取文件名
-e
在 grep 上指定一个正则表达式
{}
将 find 命令找到的每个文件放在 grep 命令的末尾
>> outfile.txt
附加到文本文件
grep -l -R <regex> <location>
应该做的工作。
如果您想在 Perl 中执行此操作,您可以使用find
人们建议的命令并将它们转换为 Perl 脚本find2perl
:
如果你有:
$ find ...
做那个
$ find2perl ...
这会输出一个执行相同操作的 Perl 程序。从那里开始,如果您需要在 Perl 中做一些简单但在 shell 中很难的事情,您只需扩展 Perl 程序。
find /path -type f -name "*.txt" | awk '
{
while((getline line<$0)>0){
if(line ~ /pattern/){
print $0":"line
#do some other things here
}
}
}'
类似的线程
find /path -type f -name "outfile.txt" | awk '
{
while((getline line<$0)>0){
if(line ~ /pattern/){
print $0":"line
}
}
}'