파일이 0개 있는 모든 하위 디렉터리 검색

파일이 0개 있는 모든 하위 디렉터리 검색

파일이 없는 모든 하위 디렉터리의 이름을 인쇄하고 싶습니다(하위 디렉터리가 포함될 수 있음). 다음은 현재 디렉터리에서 작동합니다.

$ ls -p | grep -v / | wc -l | \
  xargs -I % test % -eq 0 && pwd

더 우아한 해결책이 있을 수 있다고 생각합니다. 어떤 제안이라도 있습니까? 그리고 모든 하위 디렉터리를 반복하도록 어떻게 변경해야 합니까?

테스트 구조가 있습니다: test/test1/test4 및 test/test2/test3/test5. 유일한 파일은 test/test1에 있습니다. 기본 디렉터리(test/)에서 명령을 실행하고 싶습니다. 결과는 다음과 같습니다: test/ ; 테스트/테스트2/ ; test/test2/test3/ 왜냐하면 하위 디렉터리만 포함하고 파일은 포함하지 않는 디렉터리이기 때문입니다. 추가적으로 허용되는 것은 빈 끝점 test/test1/test4/ 및 test/test2/test3/test5입니다.

답변1

fgrep을 사용하여 파일이 있는 디렉터리를 필터링합니다.

$ find -type d | \
  grep -xFv -f <(find -type f -printf %h\\n)

답변2

이 같은:

find . -type d -exec bash -c 'files=$(find $1 -mindepth 1 -maxdepth 1 -type f | wc -l) ; [[ $files -ne 0 ]] && exit 1 ; exit 0' script {} \; -print

이는 bash -c ...디렉토리에서 파일을 확인한 후 0 또는 1을 반환하는 "작은" 스크립트일 뿐입니다.

답변3

문제에 대한 다른 접근 방식:

# Enable advanced glob
shopt -s globstar
# Enable matching hidden files (.*)
shopt -s dotglob
for d in **/; do
   nofiles=true
   for f in "$d"/*; do
     [ -f "$f" ] && nofiles=false && break
   done
   [ $nofiles = true ] && echo "$d"
done
shopt -u globstar
shopt -u dotglob

모든 폴더를 반복하고 그 안에 있는 모든 항목을 반복하고 파일을 확인합니다.

가장 짧은 스크립트는 아니지만 파일 이름에 줄 바꿈, 공백 등이 있으면 실패하지 않습니다. 그리고 5년 뒤에 다시 봐도 읽기 쉽습니다 ;-)

관련 정보