다음과 같은 여러 디렉토리가 있습니다.
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
(만족하면 삭제)