특정 유형(예: all 's)의 모든 파일을 반복적으로 검색하려는 디렉토리 트리가 있지만 .jpg
이러한 파일이 디렉토리 트리의 맨 아래에 있는 경우에만 나열하고 싶습니다.
예를 들어, 내 트리가 다음과 같다면:
home
root
f1 f2 f3
f11 f22 f33
f111 f222 f333
모든 폴더에는 '이 있습니다 . / / 등에 '만 .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 {} +
이는 디렉토리의 링크 수(처음에는 상위 항목과 자체 항목의 경우 2)가 하위 디렉토리마다( 그 항목으로 인해) 1씩 증가하는 -links 2
일부 파일 시스템의 속성에 의존합니다 . 그러나 구조가 근본적으로 다른 일부 최신 파일 시스템에는 그러한 속성이 없습니다..
..
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