我试图在unix shell脚本中编写一个if语句,如果它是空的则返回true,如果不是则返回false。
这类事......
if directory foo is empty then
echo empty
else
echo not empty
fi
我该怎么做?我被告知发现是一个很好的开始
答案 0 :(得分:4)
简单 - 使用-empty标志。引用查找手册页:
-empty True if the current file or directory is empty.
类似于:
find . -type d -empty
将列出所有空目录。
答案 1 :(得分:2)
必须有一种更简单的方法,但您可以测试一个空/非空目录,ls -1A
管道传输到wc -l
DIRCOUNT=$(ls -1A /path/to/dir |wc -l)
if [ $DIRCOUNT -eq 0 ]; then
# it's empty
fi
答案 2 :(得分:1)
find directoryname -maxdepth 0 -empty
答案 3 :(得分:1)
三个最佳答案:
find
作为OP请求; ls
; bash
,但它会调用(生成)一个子shell。[ $(find your/dir -prune -empty) = your/dir ]
dn=your/dir
if [ x$(find "$dn" -prune -empty) = x"$dn" ]; then
echo empty
else
echo not empty
fi
<强>试验:强>
> 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
find
仅打印了两个空目录(empty1
和empty2
)。
此答案类似于-maxdepth 0 -empty
中的Ariel。但这个答案有点短;)
[ $(ls -A your/directory) ]
if [ "$(ls -A your/dir)" ]; then
echo not empty
else
echo empty
fi
或
[ "$(ls -A your/dir)" ] && echo not empty || echo empty
与Michael Berkowski和gpojd答案类似。但是在这里我们不需要管道wc
。另请参阅Bash Shell Check Whether a Directory is Empty or Not nixCraft(2007)。
(( ${#files} ))
files=$(shopt -s nullglob dotglob; echo your/dir/*)
if (( ${#files} )); then
echo not empty
else
echo empty or does not exist
fi
警告:如上例所示,空目录和不存在目录之间没有区别。
最后一个答案来自Bruno De Fraine's answer以及teambob的优秀评论。
答案 4 :(得分:0)
你为什么要使用find?在bash中,ls -a
将为空目录返回两个文件(.
和..
),并且对于非空目录应该具有更多文件。
if [ $(ls -a | wc -l) -eq 2 ]; then echo "empty"; else echo "not empty"; fi
答案 5 :(得分:0)
if [ `find foo | wc -l` -eq 1 ]
then
echo Empty
else
echo Not empty
fi
foo
是此处的目录名称。
答案 6 :(得分:0)
如下所示
dircnt.sh:
-----------
#!/bin/sh
if [ `ls $1 2> /dev/null | wc -l` -gt 0 ]; then echo true; else echo false; fi
用法
andreas@earl ~
$ mkdir asal
andreas@earl ~
$ sh dircnt.sh asal
false
andreas@earl ~
$ touch asal/1
andreas@earl ~
$ sh dircnt.sh asal
true
答案 7 :(得分:0)
我不喜欢使用ls,因为我有一些非常大的目录,而且我讨厌浪费资源来用所有这些东西填充管道。
我也不喜欢用所有东西填充$ files变量。
因此,尽管@libre的所有答案都很有趣,但我发现它们都不可读,因此更喜欢使用我最喜欢的“查找”解决方案:
function isEmptyDir {
[ -d $1 -a -n "$( find $1 -prune -empty 2>/dev/null )" ]
}
这样我就可以编写一年后可以阅读的代码,而不必问“我在想什么”?
if isEmptyDir some/directory
then
echo "some/directory is empty"
else
echo "some/directory does not exist, is not a directory, or is empty
fi
或者我可以使用其他代码来找出负面结果,但是该代码 应该很明显。无论如何,我马上就会知道我在想什么。
答案 8 :(得分:0)
没有脚本,没有 fork/exec(echo 是内置的)...
[ "$(cd $dir;echo *)" = "*" ] && echo empty || echo non-empty