찾기 출력에서 ​​추적되지 않은 파일을 제거하는 방법은 무엇입니까?

찾기 출력에서 ​​추적되지 않은 파일을 제거하는 방법은 무엇입니까?

내 프로젝트 디렉터리를 보고 싶지만 findGit에서 추적하는 파일만 찾고 싶습니다. findGit이 추적하는 파일로만 결과를 제한하기 위해 출력 필터(또는 다른 방법)로 사용할 수 있는 명령이 있습니까 ?

예:

find . -name '*.postinst' | git-no-untracked

위의 나의 용도는 무엇입니까 git-no-untracked?

답변1

zsh전환 옵션이 제공 되면 다음 목록을 얻을 수 있습니다.추적 파일배열에서:

tracked_files=(${(0)"$(git ls-files -z)"})

그런 다음 관심 있는 파일 목록의 교차 작업을 수행합니다. 예를 들면 다음과 같습니다.

postinst_files=(**/*.postinst)
tracked_postinst_files=(${postinst_files:*tracked_files})

zsh glob 으로 할 수 있는 대부분의 작업을 수행할 수 있습니다 find. 예를 들어 지난 2시간 동안 마지막으로 수정된 일반 파일만 원하는 경우:

postinst_files=(**/*.postinst(.mh-2))

또는 추적 파일 목록에서 직접 패턴을 검색할 수 있습니다.

tracked_postinst_files=(${(M)tracked_files:#*.postinst})

또는 파일이 추적된 파일 목록에 있는지 확인하기 위해 glob 한정자 함수를 정의합니다.

istracked() ((${tracked_files[(Ie)${1-$REPLY}]}))

tracked_postinst_files=(**/*.postinst(+istracked))

답변2

사용 팁에 따라 git ls-files명령을 실행하고 comm. 미묘한 점은 comm입력을 정렬해야 하며 행이 정확히 텍스트와 일치해야 한다는 것입니다(따라서 ./일반적인 find명령과 같은 접두사가 없을 수 있음).

#!/bin/bash
set -eu

usage()
{
    cat <<EOF
Usage:
   $0 cmd [args... ]

Runs _cmd_ (with arguments, if provided) and filter the output to
files currently tracked by Git.

Example:
    $0 find . -name README -mmin -60

EOF
}

trap 'usage >&2' ERR

case "${1:-}" in
    -h|--help|'-?')
        usage
        exit 0
        ;;
    '')
        usage >&2
        exit 1
        ;;
esac

exec comm -12 \
     <("$@" | xargs -d '\n' -n 1 realpath -s --relative-to=. | sort) \
     <(git ls-files | sort)

답변3

이건 어때:

find . -name '*.postinst' | xargs -I something bash -c 'git ls-files | grep $(basename something)'

관련 정보