Bash检查文件夹是否包含内容

时间:2013-12-08 17:42:28

标签: bash if-statement directory

我正在尝试创建一个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目录中的所有内容)

3 个答案:

答案 0 :(得分:40)

您可以使用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以取消任何错误消息(=噪音)
  • 使用find检查grep -q .命令的输出是否为空
    • grep -q .将在处理最多一个字符后退出。如果它看到一个成功退出的角色,如果它没有(它的输入是空的)那么它会以失败退出。
  • 如果find命令的输出不为空,则该目录不为空,grep -q .成功退出。
  • 如果find命令的输出为空,则$target是空目录,或者不是目录(不存在),grep -q .退出时失败。< / LI>

我们必须直接依赖stdout find而非直接退出代码的原因是,无法使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的解决方案可能更快, 但我没有测试过它。

答案 1 :(得分:14)

GNU find会让你这样做

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

非常快,没有管道

答案 2 :(得分:4)

抱歉,我没有足够的代表回复多米尼克的评论,所以这是我能做的最好的...

  

我在Solaris上的发现没有maxdepth选项......我怎样才能实现相同的目标? - 多米尼克11月14日12:46

我无法在早期版本中说明,但在Solaris 10或更高版本上:

find . ! -name . -prune