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早期,往往真正了解它可以做多少:-)
mos*_*osg 42
找 .-type d -empty
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)
Dr.*_* II 25
find directory -mindepth 1 -type d -empty -delete
Run Code Online (Sandbox Code Playgroud)
这是我发现最有趣的版本.如果从内部目录执行,它将删除下面的所有空目录(如果目录只包含空目录,则该目录被视为空).
mindepth选项可防止目录本身被清除(如果它是空的).
小智 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
为了找到空目录(如问题标题中所指定),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)
这些答案中的大多数都解释了如何检查目录是否为空.因此,我在这里提供了我所知道的三种不同技术:
[ $(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 -prune
与find -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)(( ${#files} ))
这个技巧是100%bash
但是调用(生成)一个子shell.这个想法来自Bruno De Fraine,并通过teambob的评论进行了改进.如果你使用bash并且你的脚本不必是可移植的,我建议这个.
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)
注意:空目录和不存在目录之间没有区别(即使提供的路径是文件).
[ $(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
.但是文件和空目录之间没有区别.