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