查找不包含子目录的目录

Nat*_*Kup 12 ls shell ksh directory find

我写的脚本是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
   …
Run Code Online (Sandbox Code Playgroud)

此输出中有 2 个目录:PublicSites. 该目录Public不包含子目录,但包含Sites。中有 3 个子目录Sites。所以我只需要回显不包含目录的目录。就我而言,这只是Sites.

int*_*lfx 18

如果你能够使用find和“正常的Unix文件系统”(即,限定如,如果你正在寻找(1)-noleaf选项的说明),那么下面的命令可用于:

find . -type d -links 2
Run Code Online (Sandbox Code Playgroud)

每个目录至少有 2 个名称(硬链接):.及其名称。它的子目录(如果有)将..指向父目录,因此具有 N 个子目录的目录将具有等于 N+2 的硬链接数。因此,搜索硬链接计数等于 2 的目录,我们搜索 N=0 子目录的目录。

因此,如果您可以使用find,这可以说是最快的方法,并且显然优于在stat()每个成员的目录内容上进行的外壳内循环。

  • 值得一提的是,BTRFS 在这方面并不是一个“正常的 Unix 文件系统”:不幸的是,目录的链接计数始终为 1。(但是 `.` 和 `foo/..` 确实具有相同的 inode 号。) (4认同)

小智 3

awk你根本不需要使用。使用提供的内置测试ksh,如下所示:

#!/bin/ksh

for NAME in *
do
    FOUND=no
    if [[ -d $NAME && $NAME != '.' && $NAME != '..' ]]
    then
        for SUBNAME in $NAME/*
        do
            if [[ -d $SUBNAME ]]
            then
                FOUND=yes
                break
            fi
        done
        if [[ $FOUND == no ]]
        then
            echo Found only files in $NAME
        fi
    fi
done
Run Code Online (Sandbox Code Playgroud)

这个小脚本会查找当前目录中的所有目录,并告诉您它们是否只包含文件,没有子目录。