我有一個目錄樹,我想遞歸搜尋某種類型的所有檔案(例如 all .jpg
),但我只想列出這些檔案(如果它們位於目錄樹的底部)。
舉個例子,如果我的樹看起來像:
home
root
f1 f2 f3
f11 f22 f33
f111 f222 f333
並且所有資料夾都有.jpg
,我只想列出//等.jpg
中的,並忽略較高資料夾中的。f111
f222
f333
我知道我可以使用 find 命令(如find . -name "*.jpg"
)來獲取整個樹中所有內容的列表.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