특정 파일이 포함된 제외 경로 찾기

특정 파일이 포함된 제외 경로 찾기

.git파일이 포함된 모든 경로를 제외하여 모든 git 하위 모듈을 제외하면서 폴더의 모든 디렉터리를 재귀적으로 찾으려고 합니다 . 어떻게 해야 하나요?


설명하다:

.git파일은 각 하위 모듈 폴더의 루트 디렉터리에 있습니다. 이 하위 모듈 폴더는 어디에나 포함될 수 있습니다.


테스트 케이스

$ mkdir Test
$ cd Test
$ mkdir a
$ mkdir b
$ mkdir c
$ cd a
$ mkdir .git
$ cd ..
$ cd b
$ touch .git
$ cd ..
$ cd c
$ mkdir c1
$ mkdir c2
$ cd..
$ find . -type d \( \( ! -name . -exec [ -e {}/.git ] \; -prune \) -o \( \( \
 -name .git\
 -o -name .vscode\
 -o -name node_modules\
 -o -name Image\
 -o -name Rendered\
 -o -name iNotebook\
 -o -name GeneratedTest\
 -o -name GeneratedOutput\
  \) -prune \) -o -print \) | sort 

기대되는 성과

.
./a
./c
./c/c1
./c/c2

답변1

find작업도 테스트이므로 다음을 사용하여 테스트를 추가할 수 있습니다 -exec.

find . \( -exec [ -f {}/.git ] \; -prune \) -o \( -name .git -prune \) -o -print

이는 세 가지 작업 세트에 적용됩니다.

  • -exec [ -f {}/.git ] \; -prune다음 이름의 파일이 포함된 디렉터리 정리.git
  • -name .git -prune지정된 디렉터리를 정리합니다 .git(따라서 명령은 .git저장소의 홈 디렉터리 내에서 검색하지 않습니다).
  • -print위에서 캡처되지 않은 내용을 인쇄하십시오.

디렉토리만 일치시키려면 -type dbefore -print또는 (파일 처리 시간을 절약하기 위해)을 추가하십시오.

find . -type d \( \( -exec [ -f {}/.git ] \; -prune \) -o \( -name .git -prune \) -o -print \)

.find이는 다음 이외의 디렉터리에서 이 명령을 실행할 때도 작동합니다 .

find /some/other/path -type d \( \( -exec [ -f {}/.git ] \; -prune \) -o \( -name .git -prune \) -o -print \)

답변2

재귀를 만들 수 있습니다 find.

스크립트 파일에 다음 줄을 추가합니다.

#!/bin/bash
if [ ! -f "$1"/.git ]; then
    echo "$1"
    find "$1" -mindepth 1 -type d -prune -exec "$0" {} \;
fi

파일 이름을 로 지정했지만 findifnotgit상관 없습니다. 그런 다음 실행 가능하게 만듭니다.

chmod u+x findifnotgit

그런 다음 인수로 실행하려는 경로를 사용하여 실행하십시오.

./findifnotgit .

--> .현재 디렉토리의 경우

또는

./findifnotgit /path/to/search/

설명하다:

  • if [ ! -f "$1"/.git ]; then ... fi.git$1현재 폴더( ) 에 파일이 없는 경우에만 다음 명령을 실행하십시오.
  • -mindepth 1find가 우리가 시작한 폴더를 찾을 수 없도록 옵션이 필요합니다 . 이로 인해 무한 루프가 생성됩니다.
  • -prunefind가 디렉토리로 내려가는 것을 방지 해야 합니다 . 우리가 내부에서 직접 할게요 -exec.
  • -exec "$0" {}$0발견된 내용과 동일한 스크립트가 호출됩니다.

답변3

.git 또는 .hg 저장소 내부를 보지 않도록 find를 지시하는 방법은 다음과 같습니다.

find .  \( -iname '.git' -o -iname '.hg' \) -prune -false  -o -iname  '*thing-i-am-looking for*'

답변4

약간 더러운 스크립트이지만 파일이 포함되지 않은 모든 디렉토리를 찾습니다 .git .

#!/bin/bash

# find dirs that contain *.git files and store in array
exclude_dirs=($(find . -type f -iname ".git" | xargs -i dirname {}))

# set up the base command
command="find . -type d"

# loop over each element in array by index
for i in $(seq 0 $(expr ${#exclude_dirs[@]} - 1)); do
    command="${command} -not -path ${exclude_dirs[$i]}"
done

# run the find
eval ${command}

편집하다:

구문 오류를 수정하고 *.git다음으로 업데이트했습니다..git

편집 2:

네, 그건 틀렸어요. 죄송해요. 편집했는데 이제 실제로 작동합니다.

관련 정보