在git仓库中按文件扩展名搜索文件

15
我有一个类似于这样的字符串*.{jpg,png},但是这个字符串也可以只是*.scss - 事实上它是一个EditorConfig。然后我想要查找我的git存储库中跟踪的每个这种扩展名的文件。我尝试了几种方法,但没有找到满意的解决方案。目前我接近的一个解决办法是:git ls-tree -r master --name-only | grep -E ".*\.jpg",但这只适用于单个文件扩展名,而不适用于像这样的东西:git ls-tree -r master --name-only | grep -E ".*\.{jpg,png}"。请问有谁可以帮我吗?
1个回答

21

试试这个:

git ls-tree -r master --name-only | grep -E '.*\.(jpg|png)'

您尝试通过-E选项传递的表达式被解释为任何字符(.*),点号(\.)和字符串{jpg,png}。我猜您将Bash花括号扩展与正则表达式(括号)中的选择(|)混淆了。

考虑使用行尾锚定:'.*\.(jpg|png)$'

没有grep

正如@0andriy所指出的那样,您可以按以下方式向git ls-files传递模式:

git ls-files '*.jpg' '*.png'

注意,您需要转义参数以防止文件名扩展(通配符)。特别是星号(*)字符

匹配任意数量的重复字符或字符串或RE,包括零个实例。

但这显然仅适用于简单的git模式。对于稍微复杂一些的情况,例如“从给定集合中匹配N个字符的扩展名”,您将需要一个正则表达式(例如grep)。

@mstruebing,最好还是使用锚点,因为file.jpg.tiff将匹配'.*\.(jpg|png)',而'.*\.(jpg|png)$'则不会。 - Ruslan Osmanov
像往常一样,“无用的grep”。在*nix中,常见的规则是在使用grepcat等命令之前三思。git ls-files *.jpg *.png - 0andriy
1
@0andriy,确实如此。只有星号应该被转义以防止shell扩展(globbing):git ls-files '*.jpg' '*.png'。因此,您的命令git ls-files *.jpg *.png会被扩展为git ls-files a.jpg b.jpg c.jpg d.png e.png ...其中文件是从当前目录中的文件列表生成的。此外,简单的git模式仅适用于简单情况,例如仅通过扩展名匹配。稍微复杂一些的条件,例如“由给定集合中的N个字符组成的扩展名”需要正则表达式。 - Ruslan Osmanov
1
@mstruebing,这是因为composer.json在根目录下。使用git ls-files *composer.json命令将不能找到 some-directory/composer.json。Bash会对各种扩展(包括通配符)进行处理,然后再调用命令。*composer.json实际上是为命令构建参数列表。 - Ruslan Osmanov
1
@0andriy,已更新。@mstruebing,你可以使用git ls-files。只需确保参数已转义,并且传递的是_git模式_,而不是正则表达式。 - Ruslan Osmanov
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接