如何检查文件夹是不是有内容? [复制]
Posted
技术标签:
【中文标题】如何检查文件夹是不是有内容? [复制]【英文标题】:How do I check if a folder has contents? [duplicate]如何检查文件夹是否有内容? [复制] 【发布时间】:2013-12-25 17:43:24 【问题描述】:我正在尝试创建一个 Bash 脚本,该脚本将删除我的 .waste
目录中的所有内容。我有一个我写的基本脚本,但我希望它首先检查.waste
目录是否有内容,如果有,则回显一个简单的"Folder already empty!"
消息。我不太了解if
和if 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 .
退出失败。
我们必须依赖find
的stdout
而不是直接依赖它自己的退出代码的原因是,没有办法让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以上是关于如何检查文件夹是不是有内容? [复制]的主要内容,如果未能解决你的问题,请参考以下文章