특정 하위 디렉터리를 포함하지 않는 디렉터리 이름 찾기

특정 하위 디렉터리를 포함하지 않는 디렉터리 이름 찾기

다음과 같은 여러 디렉토리가 있습니다.

Rep1/foo/bar/files

Rep2/foo/otter/files

Rep3/foo/bar/files

...

내가 원하는 것은 하위 디렉토리 */bar/가 없는 디렉토리의 이름이며 아마도 삭제할 수도 있습니다. 어떻게 해야 하나요?

답변1

다음 스크립트를 사용할 수 있습니다find

for topdir in ./*/; do
    [ -z "$(find "$topdir" -type d -name bar -print -quit)" ] &&
    echo "$topdir"
done

이 부분은 단지 -print -quit하위 디렉터리를 찾은 후 종료하도록 최적화한 것입니다. 귀하의 버전이 이를 지원하지 않는 bar/경우 이 섹션을 제거할 수 있습니다. 명령은 계속 작동하지만 약간 느려질 수 있습니다.find-quit

아니면 이 순수 bash스크립트

shopt -s globstar
for topdir in ./*/; do
    (cd "$topdir" && compgen -G '**/bar/' > /dev/null) ||
    echo "$topdir"
done

결과가 만족스러우면 디렉토리를 삭제 echo "$topdir"로 바꾸십시오 rm -r "$topdir".

두 방법 모두 임의의 파일/디렉토리 이름을 처리할 수 있으며, 줄 바꿈이나 특수 기호가 포함된 이름도 처리할 수 있습니다 *.

답변2

bash 명령줄을 사용하여 **/files경로에 존재하지 않는 모든 하위 디렉터리를 찾으세요./bar/

find . -type d -name files | grep --invert-match /bar/

다음과 같은 결과가 출력됩니다.

./Rep2/foo/otter/files

이제 최상위 디렉토리만 나열하려면 다음을 사용하십시오.

find . -type d -name files | grep --invert-match /bar/ | cut --delimiter / --fields 2

이는 다음을 제공합니다:

Rep2

답변3

이 시도,

find . -mindepth 3 -maxdepth 3 ! -iname bar -type d | awk -F'/' '{print $2}'

Rep2

답변4

그리고 zsh:

has_bar() () (($#)) ${1-$REPLY}/*/bar(N/)

echo rm -rf rep*(/^+has_bar)

또는 단일 명령으로:

echo rm -rf rep*(/^e'[() (($#)) $REPLY/*/bar(N/)]')

echo(만족하면 삭제)

관련 정보