我对进入bash脚本感兴趣,并且想知道如何遍历unix目录并记录当前正在查看的文件的路径,如果它符合正则表达式标准。
会是这样的:
Bash或Perl脚本很好,但我更喜欢使用带有 grep , awk 等命令的bash脚本来执行此操作。
答案 0 :(得分:8)
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个文件
答案 1 :(得分:5)
使用find和grep
find . -exec grep -l -e 'myregex' {} \; >> outfile.txt
grep上的 -l
只获取文件名
-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
}
}
}'