GREP:排除特定目录中的文件扩展名

时间:2015-11-11 11:35:38

标签: bash grep

我的代码从git status -s获取添加,修改,删除,重命名,复制的文件,并将它们与文件中的文件路径列表进行比较。

git status -s |
grep -E "^M|^D|^A|^R|^C" |
awk '{if ($1~/M+/ || $1~/D+/ || $1~/A+/ || $1~/R+/ || $1~/C+/) print $2}' |
grep --file=$list_of_files --fixed-strings |
grep -r --exclude="*.jar" "SVCS/bus/projects/Resources/"
  1. 打印出像M foo.txt
  2. 这样的git状态
  3. 有些"过滤"操作
  4. 更多过滤操作
  5. 从文本文件
  6. 获取要比较的文件的路径
  7. 我试图这样做,最后一步是从特定目录中排除.jar个文件。
  8. 我该怎么做最后一步?或者需要在第4步添加一些东西?

1 个答案:

答案 0 :(得分:0)

简单的解决方法是将最后一行更改为

grep -v 'SVCS/bus/projects/Resources/.*\.jar$'

但那真的是你有一些可怕的代码。

请注意grep | awkawk | grepantipattern,这个重构怎么样?

git status -s |
grep -E "^M|^D|^A|^R|^C" |
awk '{if ($1~/M+/ || $1~/D+/ || $1~/A+/ || $1~/R+/ || $1~/C+/)

......坚持,这是什么意思? grep已确保$1包含一个或多个这些字母。 +量词在这里完全是多余的。

print $2}'

将破坏其中包含空格的文件。这是一个非常常见的错误,这种错误会加剧,因为很多时候,程序员知道它会破坏,但只是认为......不能在这里发生"。

git status -s | awk 'NR==FNR { files[$0] = 1; next }
    /^[MDARC]/ { gsub(/^[MDARC]+ /, ""); 
        if ($0 ~ /SVCS\/bus\/projects\/Resources\/.*\.jar$/)
            next;
        if ($0 in files) print }' "$list_of_files" -

NR==FNR是将第一个文件读入数组,然后进入下一个输入文件的常用习惯用法。因此,我们将$list_of_files读入关联数组files的键中;然后,如果我们从git status读取的文件名出现在键中,我们就会打印出来。然后,在特定路径中跳过.jar文件的条件是对此Awk脚本的简单补充。

这假设$list_of_files实际上是文件名所建议的实际文件列表。您的代码将在该文件中的任何位置查找匹配项,因此部分文件名也会匹配(例如,如果文件包含path/to/ick,则名为somepath/to/icktys/mackerel的文件将匹配,从而进行打印) 。如果这是预期的功能,上述脚本将需要一些相当大的修改。