Shell
查找不包含子目錄的目錄
我寫的腳本是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 個目錄:
Public
和Sites
. 該目錄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