我想查找 git 中所有具有某些扩展名的文件。扩展名列表是从我的 .editorconfig 文件生成的。
假设我有一个文件扩展名列表,例如:
.css
.html
.java
.js
(这是从 .editorconfig 生成的)
我想找到所有由 git 跟踪的具有这些扩展名的文件。
目前,我有这个命令:
grep -oE "\.[a-z0-9]+" .editorconfig | xargs -I{} grep {} <(git ls-files)
输出为:
src/main/site/src/App.css
src/main/site/src/index.css
该命令当前并未针对每个文件扩展名运行 grep,而仅针对第一个文件扩展名运行。该命令有什么问题?我希望这是一个单一命令,而不创建任何中间文件。
编辑:我从 .editorconfig 生成文件列表的原因是因为我想检查此命令生成的每个文件的代码样式,并且将来可能会将更多文件添加到配置中,因此我希望有一些面向未来性的功能。
答案1
线路
grep -oE "\.[a-z0-9]+" .editorconfig | xargs -I{} grep {} <(git ls-files)
看起来很奇怪:你要求将来自 和 的xargs
管道作为输入。 稍微尝试一下:表明获胜! 在您的示例中,似乎获胜了,这是一致的。grep
(git ls-files)
echo a | cat <(echo b)
echo b
git ls-files
不幸的是,xargs 只有一个标准输入,并且您只能搜索一个正则表达式(和-e
选项除外-f
)。
最好的办法似乎是从你的.editorconfig
文件中创建一个 regexfile 并启动`git ls-files | grep -f regexfile
答案2
感谢@Frédéric Loyer 的回答,我解决了我的问题,但必须创建一个中间文件。
我可以执行以下任一命令
grep -oE "\.[a-z0-9]+" .editorconfig > out && git ls-files | grep -f out && rm out
git ls-files > out && grep -oE "\.[a-z0-9]+" .editorconfig | xargs -I{} grep {} out && rm out
这些操作或多或少都会产生预期的效果,但是却有一些不需要的文件漏了进去。
我意识到生成的文件扩展名.editorconfig
再次被用作 grep 的模式,因此必须转义前导句点,从而得到以下命令:
grep -oE "\.[a-z0-9]+" .editorconfig | xargs -I{} echo "\{}" > out && git ls-files | grep -f out && rm out
使用 sed 的稍微简短的替代方案:
grep -oE "\.[a-z0-9]+" .editorconfig | sed 's/^/\\/' > out && git ls-files | grep -f out && rm out