查找空目录UNIX

soF*_*eld 88 unix directory bash

我需要为给定的目录列表找到空目录.有些目录里面有目录.

如果内部目录也是空的,我可以说主目录是空的,否则它不是空的.

我该怎么测试呢?

例如:

A>A1(file1),A2 this is not empty beacuse of file1
B>B1(no file) this is empty
C>C1,C2 this is empty
Run Code Online (Sandbox Code Playgroud)

Mar*_*tin 249

这取决于你想要对空目录做什么.当我希望删除树中的所有空目录时,我使用下面的命令,比如test目录.

find test -depth -empty -delete
Run Code Online (Sandbox Code Playgroud)

关于上面的命令要注意的一件事是它也会删除空文件,所以使用-type d选项来避免这种情况.

find test -depth -type d -empty -delete
Run Code Online (Sandbox Code Playgroud)

删除-delete以查看匹配的文件和目录.

如果您对空目录树的定义是它不包含任何文件,那么您可以根据是否find test -type f返回任何东西来粘在一起.

find 是一个伟大的实用程序,RTFM早期,往往真正了解它可以做多少:-)

  • -delete暗示-depth(至少对于GNU findutils 4.4.2) (7认同)
  • 不知道`-empty`,这么方便! (3认同)
  • 在MacOS-X上,对于几乎***空的目录,首先运行`find test -name".DS_Store"-delete`,然后运行`-empty delete`命令.还要注意,就像`pushd`到父目录一样,`find test`变为`find .`,但其余命令是相同的. (3认同)
  • 请小心使用“-delete”和“-type d”与“-o”的顺序,除非您想花几个小时在谷歌上搜索“ext4magic”并丢失一些仍需要备份的数据。 (3认同)
  • 然而,在不是最新和最好的Linux的机器上.(EG Solaris),那么你就没有像-empty或-delete这样的奇特发现功能. (2认同)

mos*_*osg 42

找 .-type d -empty

  • find在solaris上也不具有-empty,但是它具有-depth来强制进行深度优先遍历,因此可以在检查父目录的空度之前删除空的子目录。 (2认同)

Mar*_*tos 33

检查是否find <dir> -type f输出任何东西,这是一个例子:

for dir in A B C; do
    [ -z "`find $dir -type f`" ] && echo "$dir is empty"
done
Run Code Online (Sandbox Code Playgroud)

  • Yasir:我认为包含空文件的目录本身不是空的.这不是正确的结果吗? (3认同)
  • 不,它不会输出子目录.这就是`-type f`的用途. (2认同)
  • @akostadinov:如果我按OP指示创建目录和文件 - "mkdir ABCA/A1 A/A2 B/B1 C/C1 C/C2; 触摸A/A1/file1` - 并在我的答案中运行代码,它按照OP的要求报告B和C为空.所以你需要更具体一点,"它不会工作". (2认同)

Dr.*_* II 25

find directory -mindepth 1 -type d -empty -delete
Run Code Online (Sandbox Code Playgroud)

这是我发现最有趣的版本.如果从内部目录执行,它将删除下面的所有空目录(如果目录只包含空目录,则该目录被视为空).

mindepth选项可防止目录本身被清除(如果它是空的).

  • 您可以使用`rmdir --ignore-fail-on-non-empty -p directory`来关注它,以便除去父母. (2认同)

小智 22

find . -type d -empty

查找并列出当前树中的空目录和子目录.例如,空目录和子目录的结果列表:

./2047
./2032
./2049
./2063
./NRCP26LUCcct1/2039
./NRCP26LUCcct1/2054
./NRCP26LUCcct1/2075
./NRCP26LUCcct1/2070
Run Code Online (Sandbox Code Playgroud)

没有对目录进行任何操作.它们只是列出来的.这适合我.


oli*_*bre 16

找到空的dirs

为了找到空目录(如问题标题中所指定),mosg的答案是正确的:

find -type d -empty
Run Code Online (Sandbox Code Playgroud)

-empty可能无法在非常旧的find版本上使用(例如,HP-UX的情况).如果是这种情况,请参阅以下部分中描述的技术目录是否为空?.

删除空目录

这有点棘手:假设一个目录MyDir包含空目录.删除这些空目录后,MyDir将成为一个空目录,也应该删除.因此,我使用rmdir带有选项--parents(或-p)的命令,该选项也会在可能的情况下删除父目录:

find -type d -empty -exec rmdir -vp --ignore-fail-on-non-empty {} +
Run Code Online (Sandbox Code Playgroud)

在旧find版本上,该语句+尚不支持,因此您可以使用;:

find -type d -empty -exec rmdir -vp --ignore-fail-on-non-empty {} `;`
Run Code Online (Sandbox Code Playgroud)

目录是空的吗?

这些答案中的大多数都解释了如何检查目录是否为空.因此,我在这里提供了我所知道的三种不同技术:

  1. [ $(find your/dir -prune -empty) = your/dir ]

    d=your/dir
    if [ x$(find "$d" -prune -empty) = x"$d" ]
    then
      echo "empty (directory or file)"
    else
      echo "contains files (or does not exist)"
    fi
    
    Run Code Online (Sandbox Code Playgroud)

    变化:

    d=your/dir
    if [ x$(find "$d" -prune -empty -type d) = x"$d" ]
    then
      echo "empty directory"
    else
      echo "contains files (or does not exist or is not a directory)"
    fi
    
    Run Code Online (Sandbox Code Playgroud)

    说明:

    • find -prunefind -maxdepth 0使用较少的字符相似
    • find -type d 仅打印目录
    • find -empty 打印空目录和文件

      > mkdir -v empty1 empty2 not_empty
      mkdir: created directory 'empty1'
      mkdir: created directory 'empty2'
      mkdir: created directory 'not_empty'
      > touch not_empty/file
      > find empty1 empty2 not_empty -prune -empty
      empty1
      empty2
      
      Run Code Online (Sandbox Code Playgroud)
  2. (( ${#files} ))

    这个技巧是100%bash但是调用(生成)一个子shell.这个想法来自Bruno De Fraine,并通过teambob的评论进行了改进.如果你使用并且你的脚本不必是可移植的,我建议这个.

    files=$(shopt -s nullglob dotglob; echo your/dir/*)
    if (( ${#files} ))
    then 
      echo "contains files"
    else 
      echo "empty (or does not exist or is a file)"
    fi
    
    Run Code Online (Sandbox Code Playgroud)

    注意:空目录和不存在目录之间没有区别(即使提供的路径是文件).

  3. [ $(ls -A your/dir) ]

    这一招是从灵感nixCraft的文章发表在2007年安德鲁·泰勒于2008年,并回答gr8can8dian在2011年.

    if [ "$(ls -A your/dir)" ]
    then
      echo "contains files"
    else
      echo "empty (or does not exist or is a file)"
    fi
    
    Run Code Online (Sandbox Code Playgroud)

    或单行基础版本:

    [[ "$(ls -A your/dir)" ]] && echo "contains files" || echo "empty or ..."
    
    Run Code Online (Sandbox Code Playgroud)

    注意: 当目录不存在时ls返回$?=2.但是文件和空目录之间没有区别.