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

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

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

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

                          home
                          root
                   f1     f2     f3
                   f11    f22    f33
                   f111   f222   f333

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

find . -name "*.jpg"find 명령(예: )을 사용하여 전체 트리에 있는 모든 항목의 목록을 얻을 수 있다는 것을 알고 있지만 결과를 다음과 .jpg같은 작업을 수행하지 않고 가장 아래쪽 폴더로만 제한하는 방법을 잘 모르겠습니다. 수백 개의 폴더가 있고 마지막 수준 폴더의 이름이 개별적으로 무엇인지 모르기 때문에 / / '를 grep필터링하는 것은 실제로 가능하지 않습니다.111222333

답변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 {} +

이는 디렉토리의 링크 수(처음에는 상위 항목과 자체 항목의 경우 2)가 하위 디렉토리마다( 그 항목으로 인해) 1씩 증가하는 -links 2일부 파일 시스템의 속성에 의존합니다 . 그러나 구조가 근본적으로 다른 일부 최신 파일 시스템에는 그러한 속성이 없습니다....btrfsnilfs

를 사용하면 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

관련 정보