如何列出所有文件,但僅列出沒有子目錄的目錄?

如何列出所有文件,但僅列出沒有子目錄的目錄?

我有一個目錄樹,我想遞歸搜尋某種類型的所有檔案(例如 all .jpg),但我只想列出這些檔案(如果它們位於目錄樹的底部)。

舉個例子,如果我的樹看起來像:

                          home
                          root
                   f1     f2     f3
                   f11    f22    f33
                   f111   f222   f333

並且所有資料夾都有.jpg,我只想列出//等.jpg中的,並忽略較高資料夾中的。f111f222f333

我知道我可以使用 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

相關內容