Shell

查找不包含子目錄的目錄

  • January 28, 2019

我寫的腳本是ksh。需要直接在目前目錄下查找所有僅包含文件而不包含子目錄的目錄名稱。

我知道我可以使用ls -alR並遞歸解析第一個欄位中第一個字母的輸出(d對於目錄)。我認為awk是解析和查找的最佳方式。

例如,ls -al目前目錄中的一個簡單輸出:

  drwxr-xr-x  22 af      staff    748 18 Mar 22:21 .
  drwxr-xr-x   5 root    admin    170 17 Mar 18:03 ..
  -rw-------   1 af      staff      3 17 Mar 16:37 .CFUserTextEncoding
  drwxr-xr-x   5 af      staff    170 17 Mar 17:12 Public
  drwxr-xr-x   9 af      staff    306 18 Mar 17:40 Sites
  -rw-------   1 af      staff      3 17 Mar 16:37 textd
  …

此輸出中有 2 個目錄:PublicSites. 該目錄Public不包含子目錄,但包含子目錄Sites。中有 3 個子目錄Sites。所以我只需要回顯其中不包含目錄的目錄。就我而言,這只是Sites.

如果您能夠使用find並且正在使用“普通 Unix 文件系統”(即,如find(1)中*-noleaf*選項描述中所定義的那樣),則可以使用以下命令:

find . -type d -links 2

每個目錄至少有 2 個名稱(硬連結):.及其名稱。它的子目錄(如果有的話)將..指向父目錄,因此具有 N 個子目錄的目錄將具有等於 N+2 的硬連結數。因此,搜尋硬連結計數等於 2 的目錄,我們搜尋具有 N=0 子目錄的目錄。

因此,如果您可以使用find,這可以說是最快的方法,並且明顯優於對其stat()每個成員的目錄內容的外殼循環。

*/匹配目前目錄的子目錄。這包括指向目錄的符號連結,您可能希望也可能不希望。

在 ksh93 中,~(N)如果不匹配,則在模式的開頭添加會使其擴展為空列表。沒有這個,如果沒有匹配,模式保持不變。

以下 ksh93 函式列出了目前目錄的子目錄,其中不包含任何子目錄或指向目錄的連結。

list_leaf_directories () {
 local FIGNORE='.?(.)'        # don't ignore dot files
 local d
 for d in */; do
   [[ -L $d ]] || continue;   # skip symbolic links
   set -- ~(N)"$d"/*/
   if ((!$#)); then echo "$d"; fi
 done
done

引用自:https://unix.stackexchange.com/questions/68577