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)
归档时间: |
|
查看次数: |
61456 次 |
最近记录: |