查找空目录UNIX
我需要为给定的目录列表find空目录。 一些目录里面有目录。
如果里面的目录也是空的,我可以说主目录是空的,否则它不是空的。
我如何testing这个?
例如:
A>A1(file1),A2 this is not empty beacuse of file1 B>B1(no file) this is empty C>C1,C2 this is empty
检查是否find <dir> -type f
输出任何东西,这里是一个例子:
for dir in ABC; do [ -z "`find $dir -type f`" ] && echo "$dir is empty" done
这取决于你想用空目录做什么。 当我想删除树中的所有空目录时,使用下面的命令,比如说test
目录。
find test -depth -empty -delete
有一件事要注意上面的命令, 它也会删除空文件 ,所以使用-type d选项来避免这种情况。
find test -depth -type d -empty -delete
删除 – 删除以查看匹配的文件和目录。
如果你的空目录树的定义是它没有包含任何文件,那么你可以根据find test -type f
是否返回任何东西来把东西粘在一起。
find
是一个伟大的实用程序,RTFM早期,往往要真正了解它可以做多less:-)
找 。 型d-空
find directory -mindepth 1 -type d -empty -delete
这是我发现最有趣的版本。 如果从内部目录执行,它将删除下面的所有空目录(如果一个目录只包含空目录,则该目录被认为是空的)。
mindepth选项防止目录本身被删除,如果它是空的。
只要find空的dirs
为了find空目录(问题标题中指定), mosg的答案是正确的:
find -type d -empty
但-empty
可能不适用于非常旧的find
版本(例如, HP-UX就是这种情况)。 如果这是你的情况,请参阅下面的部分介绍的技术是一个目录为空? 。
删除空的dirs
这有点棘手:假设一个目录MyDir
包含空目录。 删除这些空目录后, MyDir
将成为一个空目录,也应该被删除。 因此,我使用带有选项--parents
(或-p
)的命令rmdir
,在可能的情况下也会删除父目录:
find -type d -empty -exec rmdir -vp --ignore-fail-on-non-empty {} +
在较旧的find
版本中,声明+
尚不被支持,因此您可以使用;
代替:
find -type d -empty -exec rmdir -vp --ignore-fail-on-non-empty {} `;`
目录是空的吗?
这些答案大多解释如何检查一个目录是否为空。 所以我在这里提供了我所知道的三种不同的技术:
-
[ $(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
一个变化:
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
说明:
-
find -prune
类似于使用较less字符的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
-
-
(( ${#files} ))
这个技巧是100%
bash
但调用(派生)一个子shell。 这个想法来自Bruno De Fraine ,并由teambob的评论改进。 我build议这个如果你使用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
注意:空目录和不存在的目录(甚至当提供的path是文件时)没有区别。
-
[ $(ls -A your/dir) ]
这个诀窍是从nixCraft 2007年发表的文章中得到的启示。Andrew Taylor在2008年回答,2011年在gr8can8dian回答。
if [ "$(ls -A your/dir)" ] then echo "contains files" else echo "empty (or does not exist or is a file)" fi
或者单行双语版本:
[[ "$(ls -A your/dir)" ]] && echo "contains files" || echo "empty or ..."
注意:当目录不存在时,
ls
返回$?=2
。 但是一个文件和一个空目录没有区别。
find . -type d -empty
find并列出当前树中的空目录和子目录。 例如结果列表的空dirs和subdirs:
./2047 ./2032 ./2049 ./2063 ./NRCP26LUCcct1/2039 ./NRCP26LUCcct1/2054 ./NRCP26LUCcct1/2075 ./NRCP26LUCcct1/2070
目录上没有任何操作。 他们只是列出。 这对我有用。
我创build了一个简单的结构如下:
testing/ testing/ TEST2 / testing/ TEST2 / test2.2 / testing/ TEST3 / testing/ TEST3 /文件
test/test3/file
包含一些垃圾文本。
发出find test -empty
返回“ test/test2/test2.2
”作为唯一的空目录。
这个recursion函数似乎有诀窍:
# Bash findempty() { find ${1:-.} -mindepth 1 -maxdepth 1 -type d | while read -r dir do if [[ -z "$(find "$dir" -mindepth 1 -type f)" ]] >/dev/null then findempty "$dir" echo "$dir" fi done }
给出这个例子的目录结构:
。 | - dir1 / | - dir2 / | ` - dirB / | - dir3 / | ` - dirC / | ` - file5 | - dir4 / | | - dirD / | ` - file4 ` - dir5 / ` - dirE / ` - dir_V /
运行该function的结果是:
./dir1 ./dir5/dirE/dir_V ./dir5/dirE ./dir5 ./dir2/dirB ./dir2
错过/dir4/dirD
。 如果在fi
之后移动recursion调用findempty "$dir"
,函数将在其结果中包含该目录。
一个简单的方法是,
$ [ "$(ls -A /path/to/direcory)" ] && echo "not empty" || echo "its empty"
也,
if [ "$(ls -A /path/to/direcory)" ]; then echo "its not empty" else echo "empty directory"
find . -name -type d -ls |awk '($2==0){print $11}'
rmdir *
怎么样? 该命令将在非空目录上失败。