현재 폴더의 모든 하위 디렉터리를 살펴보고 ".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
일치하는 엔터티가 포함된 디렉터리(즉, 현재 확인 중인 디렉터리의 상위 디렉터리)에서 명령을 실행하면 .
모든 하위 디렉터리에 적용됩니다. 테스트가 잘못된 디렉터리에서 실행되고 있습니다. 그리고:
{}
inexec
/ 명령을 재사용하면 안 됩니다-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
이는 원하는 결과를 얻기 위해 사용된 테스트 실행을 무효화합니다.