如何过滤文件列表中的纯文本文件?

如何过滤文件列表中的纯文本文件?

我想要一个git openlast命令来查看最后一次提交,获取添加或更改的文件列表,将它们过滤为仅文本文件,最后在编辑器中打开它们。

到目前为止,我已完成以下操作:

git show --stat HEAD
read -p "Open in Vim tabs? (Y/n)" -n 1 -r
if [[ -z $REPLY || $REPLY =~ [Yy] ]]; then
  vim -p $(git diff --diff-filter=AM --ignore-submodules --name-only HEAD^)
fi

缺点是如果我在之前的提交中添加或更改二进制文件,那么它将由编辑器(在本例中为 Vim)打开。有没有办法获取命令输出的列表git diff并删除二进制文件?

答案1

您可以通过管道传输xargs并使用grep -Il ""它来过滤二进制文件:

git diff --diff-filter=AM --ignore-submodules --name-only HEAD^ | \
  xargs grep -Il ""

git openfiles命令示例

#!/bin/bash
git show --stat HEAD
files=($(git diff --diff-filter=AM --ignore-submodules --name-only HEAD^ | xargs grep -Il ""))
read -p "Open ${#files[@]} files in Vim tabs? (Y/n)" -n 1 -r
if [[ -z $REPLY || $REPLY =~ [Yy] ]]; then
  exec vim -p ${files[@]}
else
  exit 1
fi

答案2

如果有文件扩展名,可以使用 Gawk 来在列表中选择您想要的文件。示例具有“.txt”和“.jpeg”扩展名。正则表达式用于编辑 git 的输出。

git show --stat HEAD
commit ec07d8306e9e61894d18e6f8d6ea1e5d650c0712
Author: root <root@somebox>
Date:   Thu Dec 17 17:19:30 2015 -0500

test project commit

add email addresses.jpeg           | Bin 0 -> 127688 bytes
allpermissions.jpeg                | Bin 0 -> 126620 bytes
error.jpeg                         | Bin 0 -> 227469 bytes
sonic_boom.jpeg                    | Bin 0 -> 112958 bytes
test1.jpeg                         | Bin 0 -> 96857 bytes
test1.txt                          |   1 +
test2.txt                          |   1 +
top_cipher_test_results.jpeg       | Bin 0 -> 149293 bytes

Gawk 删除二进制 .jpeg 扩展文件。

git show --stat HEAD|awk '{ if($1 ~ /.jpeg/)print $1}'

如果需要,包含 .txt 和 .jpeg:

git show --stat HEAD|awk '{ if($1 ~ /.jpeg|.txt/)print $1}'

相关内容