파일 목록에서 일반 텍스트 파일을 필터링하는 방법은 무엇입니까?

파일 목록에서 일반 텍스트 파일을 필터링하는 방법은 무엇입니까?

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}'

관련 정보