查找不包含子目录的目录

查找不包含子目录的目录

我写的脚本是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.

答案1

如果您能够使用find并且正在使用“普通 Unix 文件系统”(即,如查找(1)在下面-无叶选项描述),则可以使用以下命令:

find . -type d -links 2

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

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

答案2

*/匹配当前目录的子目录。这包括您可能需要也可能不希望的目录符号链接。

在 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

答案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

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

答案4

如果我没有误解你的意思,你只想在目录中查找文件而不是子目录。如果这是您的意图,这就是解决方案

find . -type f

如果您想查找常规文件以外的文件(例如块设备文件、字符设备文件等),请参阅find命令的手册页并查找类型该页面上的关键字。您将看到不同的文件类型,包括常规文件和目录等。

希望这就是您正在寻找的

相关内容