Syl*_*ler 36 directory bash if-statement
我正在尝试创建一个删除.waste目录中所有内容的Bash脚本.我有一个我写的基本脚本,但我希望它首先检查.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/*
Run Code Online (Sandbox Code Playgroud)
(PS不确定星号是否在最后是正确的,我确实尝试了它的脚本,我记得它也删除了bin目录中的所有内容)
Sto*_*ica 41
您可以检查目录是否为空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
Run Code Online (Sandbox Code Playgroud)
那是:
find找到下的第一个文件系统条目$target(-mindepth 1),打印(-print),并停止处理(-quit)
stderr以抑制任何错误消息(=噪音)find使用命令检查命令的输出是否为空grep -q .
grep -q .将在处理最多一个字符后退出.如果它看到一个成功退出的角色,如果它没有(它的输入是空的)那么它会以失败退出.find命令的输出不为空,则该目录不为空,并grep -q .退出成功.find命令的输出为空,则$target它是一个空目录,或者不是一个目录(不存在),并grep -q .以失败退出.我们必须依靠其原因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
Run Code Online (Sandbox Code Playgroud)
像这样捕获命令输出使用子shell.我认为使用的解决方案grep可能更快,但我还没有测试过.
kdu*_*ubs 15
GNU find会让你这样做
find . -maxdepth 0 -empty -exec echo {} is empty. \;
Run Code Online (Sandbox Code Playgroud)
很快,没有管道
小智 5
对不起,我没有足够的代表来回答多米尼克的评论,所以这是我能做的最好的......
我在 Solaris 上的发现没有 maxdepth 选项......我怎样才能达到同样的目标?– 多米尼克 11 月 14 日 12:46
我不能肯定早期版本,但在 Solaris 10 或更高版本上:
find . ! -name . -prune
Run Code Online (Sandbox Code Playgroud)