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