디렉토리 트리가 있고 특정 유형(예: all .jpg
)의 모든 파일을 재귀적으로 검색하고 싶지만 파일이 디렉토리 트리의 맨 아래에 있는 경우에만 파일을 나열하고 싶습니다.
예를 들어, 내 트리가 다음과 같다면:
home
root
f1 f2 f3
f11 f22 f33
f111 f222 f333
모든 폴더에 이 항목이 있습니다 . //etc에 있는 항목만 나열하고 상위 폴더에 있는 항목은 무시하고 .jpg
싶습니다 ..jpg
f111
f222
f333
find . -name "*.jpg"
find 명령(예: )을 사용하여 전체 트리에 있는 모든 항목의 목록을 얻을 수 있다는 것을 알고 있지만 "결과 추가"와 같은 작업을 수행하지 않고 .jpg
맨 아래 폴더로만 목록을 제한하는 방법을 잘 모르겠습니다 . 수백 개의 폴더가 있고 마지막 수준 폴더가 모든 폴더에 대해 별도의 이름을 가지고 있는지 모르기 때문에 실제로 실현 가능하지 않습니다.grep
111
222
333
답변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