.git을 포함하지 않는 현재 디렉터리의 모든 하위 디렉터리를 인쇄합니다.

.git을 포함하지 않는 현재 디렉터리의 모든 하위 디렉터리를 인쇄합니다.

현재 폴더의 모든 하위 디렉터리를 살펴보고 ".git"이 포함되지 않은 하위 디렉터리가 있는지 알려주는 bash 라인을 작성하려고 합니다. 가짜:

for subdir in currentdir
  if .git does not exist
    print subdir

다음은 제가 시도하고 있는 코드 한 줄입니다. 작동하지 않고 모든 하위 디렉터리를 인쇄하는 것 같습니다.

find . -maxdepth 1 -type d -execdir $SHELL -c '[ ! -d ".git" ] && echo "not git repo:" {}' $SHELL -c '{}' ';'

다음과 같은 .git이 있는 모든 하위 디렉터리를 인쇄할 수 있는 몇 가지 솔루션을 찾았습니다.이것- 저는 반대로 하려고 노력 중이에요.

내가 뭘 잘못했나요? 가능합니까?

답변1

첫째, -execdir명령이 이상해 보입니다(2x $SHELL -c?).

$SHELL -c '[ ! -d ".git" ] && echo "not git repo:" {}' $SHELL -c '{}' ';'

또한 -execdir일치하는 엔터티가 포함된 디렉터리(즉, 현재 확인 중인 디렉터리의 상위 디렉터리)에서 명령을 실행하면 .모든 하위 디렉터리에 적용됩니다. 테스트가 잘못된 디렉터리에서 실행되고 있습니다. 그리고:

  • {}in exec/ 명령을 재사용하면 안 됩니다 -execdir.
  • 을 사용할 이유가 없습니다 $SHELL. 이것은 사용자의 로그인 셸이며 스크립트 등에 사용하는 데 특별한 의미가 없습니다. 직접 사용하거나 선택한 쉘인 sh경우 사용 bash하십시오 .ksh

이것은 효과가 있을 수 있습니다:

find . -maxdepth 1 -type d -exec sh -c '! [ -d "$1/.git" ] && echo "not git repo: $1"' _ {} \;

-exec명령은 각 하위 디렉터리에 대해 전달된 인수가 있는지 .git차례로 확인합니다. -mindepth 1다음을 사용하여 현재 디렉터리를 제외 할 수도 있습니다 .

find . -maxdepth 1 -mindepth 1 -type d -exec sh -c '! [ -d "$1/.git" ] && echo "not git repo: $1"' _ {} \;

또는 bash를 사용하여 dotglob숨겨진 디렉터리를 일치시킬 수 있습니다.

(shopt -s dotglob; for d in ./*/; do [[ -d $d/.git ]] || echo "not git repo: $d"; done)

답변2

무루의 대답귀하의 접근 방식에 어떤 문제가 있는지 설명하십시오. 대답말씀하신 문제는쉘을 포함하지 않는 더 간단한 접근 방식을 제안하십시오.

find . -maxdepth 1 -type d -exec test '!' -e '{}/.git' ';' -printf "not git repo: %p\n"

(귀하의 find지원을 가정 -printf), 또는

find . -maxdepth 1 -type d -exec test '!' -e '{}/.git' ';' -print

-exec test이는 원하는 결과를 얻기 위해 사용된 테스트 실행을 무효화합니다.

관련 정보