我正在尝试创建一个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/*
(附注:不确定最后的星号是否正确,我确实用它尝试了脚本,我记得它也删除了bin
目录中的所有内容)
发布于 2013-12-09 01:53:09
您可以使用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
以取消显示任何错误消息(= code
grep -q .
检查grep -q .
命令的输出是否为空处理至多一个字符后将退出。如果它看到一个字符,它会成功退出,如果没有(它的输入是空的),那么它会使用failure.退出
find
命令的输出不为空,则目录不为空,并且grep -q .
成功退出。find
命令的输出为空,则$target
或者是空目录,或者不是目录(不存在),并且grep -q .
以失败退出。<代码>H236<代码>F237我们必须依赖find
的stdout
,而不是直接依赖它自己的退出代码的原因是,无论是否找到文件,都无法让find
命令使用可区分的退出代码。
另一种替代方法是捕获find
的输出并检查它是否是空字符串,而不是通过管道传输到grep -q
。
#!/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
的解决方案可能更快,但我还没有测试过它。
发布于 2014-10-08 01:42:42
GNU find可以让你做到这一点
find . -maxdepth 0 -empty -exec echo {} is empty. \;
非常快,而且没有管道
https://stackoverflow.com/questions/20456666
复制相似问题