如何检查文件夹是不是有内容? [复制]

Posted

技术标签:

【中文标题】如何检查文件夹是不是有内容? [复制]【英文标题】:How do I check if a folder has contents? [duplicate]如何检查文件夹是否有内容? [复制] 【发布时间】:2013-12-25 17:43:24 【问题描述】:

我正在尝试创建一个 Bash 脚本,该脚本将删除我的 .waste 目录中的所有内容。我有一个我写的基本脚本,但我希望它首先检查.waste 目录是否有内容,如果有,则回显一个简单的"Folder already empty!" 消息。我不太了解ifif else 语句,也不知道[ ] 等式需要检查是否存在。

基本代码:

#! /bin/bash
echo "The files have been deleted:"
cd /home/user/bin/.waste/
ls
rm -rf /home/user/bin/.waste/*

(P.S. 不确定最后的星号是否正确,我确实用它尝试了脚本,我记得它也删除了 bin 目录中的所有内容)

【问题讨论】:

【参考方案1】:

您可以使用find 检查目录是否为空,并处理其输出:

#!/bin/sh
target=$1
if find "$target" -mindepth 1 -print -quit 2>/dev/null | grep -q .; then
    echo "Not empty, do something"
else
    echo "Target '$target' is empty or not a directory"
fi

即:

使用find$target-mindepth 1)下找到第一个文件系统条目,打印它(-print),然后停止处理(-quit) 重定向 stderr 以抑制任何错误消息(= 噪音) 使用grep -q .检查find命令的输出是否为空 grep -q . 最多处理一个字符后会退出。如果它看到一个字符,则成功退出,如果没有(其输入为空),则失败退出。 如果find命令的输出不为空,则目录不为空,grep -q .成功退出。 如果find 命令的输出为空,则$target 要么是空目录,要么不是目录(不存在),并且grep -q . 退出失败。

我们必须依赖findstdout 而不是直接依赖它自己的退出代码的原因是,没有办法让find 命令使用可区分的退出代码,以防万一文件被找到。

除了管道到grep -q,另一种选择是捕获find 的输出并检查它是否为空字符串。

#!/bin/sh
target=$1
if [ "$(find "$target" -mindepth 1 -print -quit 2>/dev/null)" ]; then
    echo "Not empty, do something"
else
    echo "Target '$target' is empty or not a directory"
fi

像这样捕获命令输出使用子shell。 我认为使用grep 的解决方案可能更快, 但我没有测试过。

【讨论】:

@HermanTorjussen 您可能不是指重定向“输出”而是stderr。我故意放了两个例子,一个有重定向,一个没有。我希望 OP 可以自己决定错误消息是混乱还是有用。 @evilotto 你说对了一部分。但是ls -U 是不可移植的:它在 GNU 和 BSD 系统中做不同的事情。使用更好的便携式解决方案查看我的更新答案。 唉,find -quit 选项在某些 Linux 发行版上无法识别,例如 Angstrom。我最终不得不写类似if [ -d "$target" ] && [ -z "$(ls -A "$target")" ]; then ... 记住 rmdir 不会对非空目录造成损害有时很有用。因此,如果目标恰好是仅在目录为空时删除目录,那么rmdir dir &>/dev/null 可能会填满账单,退出状态会通知您它是否为空(现在已经消失)或不(并且仍然存在)。 @devstuff 所以基本上你将管道换成子外壳。我希望管道更快。对于它的价值,我完全重写了我的答案以使其更清晰,感谢您的额外推动。【参考方案2】:

GNU find 会让你这样做

find . -maxdepth 0 -empty -exec echo  is empty. \;

很快,没有管道

【讨论】:

我在 Solaris 上的 find 没有 maxdepth 选项...我怎样才能达到同样的效果? 仅供参考,如果目录不存在,则在 Ubuntu 16.04 服务器上不起作用(向终端返回错误或以标准“没有此类文件或目录”错误退出脚本。【参考方案3】:

抱歉,我没有足够的代表用评论来回答 Dominik 的评论,所以这是我能做的最好的......

我在 Solaris 上的发现没有 maxdepth 选项......我怎样才能达到同样的效果? – 多米尼克 11 月 14 日 12:46

我不能肯定地说在早期版本上,但在 Solaris 10 或更高版本上:

find . ! -name . -prune 

【讨论】:

一个简单的 bash sn-p 来满足你的需要:``` #!/bin/bash if [ ! -d 目录] || [ $(ls -l directory | wc -l) -lt 2 ] 然后 echo 文件夹为空 fi ``` 我会这样做:如果 [ ! -d 目录] || [ $(ls -A directory | wc -l) -eq 0 ] 然后 echo 文件夹为空 fi

以上是关于如何检查文件夹是不是有内容? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何检查文件是不是存在(无论其文件类型如何)? [复制]

如何检查python中是不是存在文件? [复制]

如何检查文件名是不是已经存在? [复制]

如何检查文件是不是存在,那么创建新文件的过程是啥? [复制]

如何检查一行是不是有列表中的一个字符串? [复制]

如何检查选择器是不是匹配 jQuery 中的某些内容? [复制]