查找不包含子目录的目录


10

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

Answers:


1

您根本不需要使用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

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


14

如果能够使用find并且正在使用“常规Unix文件系统”(即,在-noleaf选项描述下的find(1)中定义),则可以使用以下命令:

find . -type d -links 2

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

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


如果目录包含任何文件,这似乎不起作用。
user394

1
这与目录列表中的条目无关,而与指向目录的inode的硬链接有关。例如,如果/some/directory有inode#12345678,如果没有子目录,则将有2个硬链接指向该inode:/some/directory/./some/directory。无论目录中是否有文件,它都可以工作。
telcoM

在这方面值得一提的是BTRFS并不是“普通的Unix文件系统”:不幸的是,目录的链接数始终为1。(但是,.并且foo/..确实有相同的inode编号。)
Peter Cordes

3

*/匹配当前目录的子目录。这包括指向目录的符号链接,您可能希望也可能不希望这样做。

在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

0

如果我不会误会您,则只希望在目录中找到文件,而不是子目录中的文件。如果这是您的意图,这是解决方案

find . -type f

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

希望这是您要寻找的


不,这根本不是问题。一旦您s / catalogue / directory / g,它就很清楚了。Nat Kup正在寻找不包含子目录的目录。
吉尔斯(Gillles)“所以-别再邪恶了”
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.