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

Syl*_*ler 36 directory bash if-statement

我正在尝试创建一个删除.waste目录中所有内容的Bash脚本.我有一个我写的基本脚本,但我希望它首先检查.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/*
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 .以失败退出.

我们必须依靠其原因stdoutfind,而不是自己的退出代码直接的是,有没有办法让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可能更快,但我还没有测试过.

  • @devstuff所以基本上你将管道交易到子壳.我希望管道更快.为了它的价值,我完全重写了我的答案,使其更清洁,感谢额外的推动. (2认同)

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)

  • 一个简单的 bash 片段可以满足您的要求: ``` #!/bin/bash if [ ! -d 目录] || [ $(ls -l 目录 | wc -l) -lt 2 ] 然后 echo 文件夹为空 fi ``` (2认同)