Bash 过滤掉具有给定扩展名的文件

Bash filter out files with a given extension

我已经在 运行 Rubocop 中添加了一个预提交挂钩,以防止正在准备提交的任何文件。但是,当您给它一个 .png 或 .svg 文件时,Rubocop 会出错。我已将这些文件扩展名添加到 .rubocop.yml 中的 exclude 块中,但因为我实际上是按名称明确提供文件,这似乎并不能解决问题。

这是我的预提交脚本:

#!/usr/bin/env bash

set -e

git diff --staged --diff-filter=d --name-only | xargs bundle exec rubocop

我认为该方法是从 git 命令中获取文件列表并循环遍历它们,过滤掉所有 .png 或 .svg 文件,但老实说我不知道​​该怎么做.关于按扩展名过滤文件的任何建议?

一个想法可能是使用 grep.

过滤掉这些扩展名
git diff --staged --diff-filter=d --name-only \
  | grep --invert-match '\.\(png\|svg\)$' \
  | xargs bundle exec rubocop

有一个标志 --only-recognized-file-types 我认为它可以满足您的需要。

git diff  --staged --diff-filter=d --name-only -- ':!*.png' ':!*.svg'

或者为了更容易控制,您可以在 .gitattributes.

中检查属性并设置匹配

git help glossary 并搜索 pathspec,可能有更快捷的途径来找到它的文档,但我知道的就是这个。