我的代码从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/"
M foo.txt
.jar
个文件。我该怎么做最后一步?或者需要在第4步添加一些东西?
答案 0 :(得分:0)
简单的解决方法是将最后一行更改为
grep -v 'SVCS/bus/projects/Resources/.*\.jar$'
但那真的是你有一些可怕的代码。
请注意grep | awk
和awk | grep
是antipattern,这个重构怎么样?
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
的文件将匹配,从而进行打印) 。如果这是预期的功能,上述脚本将需要一些相当大的修改。