폴더만 포함된 Linux 시스템에서 폴더를 재귀적으로 찾는 방법은 무엇입니까?

폴더만 포함된 Linux 시스템에서 폴더를 재귀적으로 찾는 방법은 무엇입니까?

동일한 수준에 하나 이상의 디렉터리만 포함된 디렉터리를 반복적으로 찾는 명령을 실행하려고 합니다. 명령 을 사용하는 것이 좋습니다 find. 좋다 find . -type d.

예를 들어, 다음 파일 구조에서:

/tmp/folder1/folder1a/test.jpg
/tmp/folder1/file1a.tmp
/tmp/folder2/folder2a/test.jpg
/tmp/folder3/folder3a/
/tmp/folder3/folder3b/file.jpg

나는 치고 싶은데 folder2파일 folder3자체가 포함되어 있지 않기 때문에 (파일 포함) 폴더만 포함되어 있습니다.

답변1

comm -23 <(find . -type d ! -empty | sort -u) <(find . -type f -printf '%h\n' | sort -u)

이는 파일이 포함된 폴더를 제외하고 비어 있지 않은 폴더(최소 한 개 포함)의 목록입니다. 파이프 및 심볼릭 링크 ! -type d와 같은 항목도 제외하려면 -type f. find는 복잡한 콘텐츠 기준(XPath가 아님)에서 일치할 수 없기 때문에 단일 find 문에서는 수행할 수 없습니다.

답변2

내가 당신을 올바르게 이해한다면, 이렇게 해야 합니다:

find . -type d ! -empty -exec sh -c '\
[ -z "`find "$1" -maxdepth 1 -mindepth 1 ! -type d -print -quit`" ]\
' sh {} \; -print

POSIX에 없는 , 및 으로 인해 솔루션이 OS에서 작동하지 않을 수 있습니다( -empty단지 -maxdepth속도 -mindepth를 높이기 위한 것이므로 이 부분을 생략할 수 있지만 중요합니다).-quit-print -quit-maxdepth 1 -mindepth 1

비결은 비어 있지 않은 모든 디렉토리에 대해 별도의 쉘을 실행하여 디렉토리에 디렉토리가 아닌 디렉토리가 포함되어 있지 않은지 (비재귀적으로) 확인하는 것입니다. 이것은 으로 이루어지며 -exec sh … \;여기서는 테스트 역할을 합니다. 디렉토리에 디렉토리가 아닌 항목이 포함되어 있지 않으면 내부의 출력은 find비어 있으므로 테스트( [ -z … ])는 종료 상태를 반환 0하고 는 true를 sh반환합니다 .0-exec

관련 정보