모든 파일을 나열하고 하위 디렉터리가 없는 디렉터리만 나열하려면 어떻게 해야 합니까?

모든 파일을 나열하고 하위 디렉터리가 없는 디렉터리만 나열하려면 어떻게 해야 합니까?

디렉토리 트리가 있고 특정 유형(예: all .jpg)의 모든 파일을 재귀적으로 검색하고 싶지만 파일이 디렉토리 트리의 맨 아래에 있는 경우에만 파일을 나열하고 싶습니다.

예를 들어, 내 트리가 다음과 같다면:

                          home
                          root
                   f1     f2     f3
                   f11    f22    f33
                   f111   f222   f333

모든 폴더에 이 항목이 있습니다 . //etc에 있는 항목만 나열하고 상위 폴더에 있는 항목은 무시하고 .jpg싶습니다 ..jpgf111f222f333

find . -name "*.jpg"find 명령(예: )을 사용하여 전체 트리에 있는 모든 항목의 목록을 얻을 수 있다는 것을 알고 있지만 "결과 추가"와 같은 작업을 수행하지 않고 .jpg맨 아래 폴더로만 목록을 제한하는 방법을 잘 모르겠습니다 . 수백 개의 폴더가 있고 마지막 수준 폴더가 모든 폴더에 대해 별도의 이름을 가지고 있는지 모르기 때문에 실제로 실현 가능하지 않습니다.grep111222333

답변1

이 작업은 두 단계로 수행할 수 있습니다.

find . -type d -links 2 -print0 | xargs -0 -I{} find {} -name \*.jpg

첫 번째 명령은 하위 디렉터리 없이 모든 디렉터리를 나열합니다(각 하위 디렉터리는 링크 수에 1을 추가하는 반면 빈 디렉터리에는 2가 있기 때문입니다). 두 번째는 find각 결과를 수동으로 호출합니다.

답변2

POSIX는 다음과 같습니다.@TomHunt의 솔루션.

find . -type d -links 2 -exec sh -c '
  find "$@" -type f -name "*.jpg"' sh {} +

이는 -links 2일부 파일 시스템 속성에 의존합니다. 즉, 디렉토리의 링크 수(초기에는 상위 디렉토리의 항목과 자체 항목의 경우 2)가 .각 하위 디렉토리에 대해(그 안의 항목으로 인해) 1씩 증가합니다. ..예를 들어 구조가 완전히 다른 일부 최신 파일 시스템에는 btrfs이러한nilfs 속성이 없습니다.

를 사용하면 zsh다음을 수행할 수 있습니다.

has_subdirs() {
  local l
  l=($REPLY/*(/DNoN[1]))
  (($#l))
}
dirs_without_subdirs=(**/*(DN^+has_subdirs))
jpgs=($^dirs_without_subdirs/*.jpg(ND.))
(($#jpgs)) && printf '%s\n' $jpgs

관련 정보