recursion地查找所有不以评论开头的php文件

是否有任何有用的命令组合(sed / grep / find等)我可以用来检测.php文件不是以评论开头? 我当然可以写一个小脚本,但我宁愿使用shell命令。

匹配模式:

<?php /* 

我想要search文件的内容,而不是文件名。

我必须处理一个被黑客入侵的网站,其中代码注入遵循一定的模式。

 <?php $code.... /* 

要么

 <?php $code.... /* 

使用gnu grep你可以使用这个递归搜索:

 grep -rvlz $'^[[:space:]]*<?php\n/\*' --include='*.php' 

这将检测所有以php标签开头的php文件;

 find ./ -iname '*.php' | xargs head -v -n 1 | grep -B 1 '<?php' 
  • 用php扩展名查找所有文件。
  • 头第一行,包括文件名。
  • grep这个输出找到任何以php标签开头的文件。
  • -B 1 :在比赛前保留1行,以便得到文件名。

这是快速和肮脏的,你可以看中,使输出更好,或使其更加强大。

awk是你的朋友:

  find /your/path/here -type f -iname "*.php" -exec \ awk 'FNR==2{if($0~/^\/\*/){print FILENAME};exit}' {} \; 

笔记

  1. {}是通过find传递给awk的参数。
  2. awk builtin FILENAME包含当前正在处理的文件
  3. $0~/^\/\*/在第二行的开头搜索/*
  4. FNR==2外观选择要处理的记录号, exit用于处理所需记录后退出awk。

从shell中可以使用这个小awk脚本来查看文件是否不是以注释开始的:

 awk 'NR==2 && f$0!="<?php/*"{print FILENAME}NR>2{exit 1}{f=$0}' file.php 

要递归地将脚本应用于目录,请使用:

 find -name '*.php' \ -exec awk 'NR==2 && f$0!="<?php/*"{print FILENAME}NR>2{exit 1}{f=$0}' {} \; 

可能的空格是对上述解决方案的一个限制,但是通过在与<php?/*比较之前删除所有可能的空格,

用于查找文件的UNIX工具是非常恰当的命名find ,UNIX工具对通用目的的文本操作是awk

 find . -name '*.php' -print | xargs awk -v RS='^$' 'index($0,"<?php\n/*")==1{print FILENAME}' 

以上使用的是GNU awk for multi-char RS。 我们使用index()来强制执行一个字符串而不是正则表达式搜索,因为你的目标字符串包含多个正则表达式元字符,所以这使我们避免了所有这些。