首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何检查文件夹是否包含内容?

如何检查文件夹是否包含内容?
EN

Stack Overflow用户
提问于 2013-12-09 01:42:28
回答 2查看 70.9K关注 0票数 40

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

(附注:不确定最后的星号是否正确,我确实用它尝试了脚本,我记得它也删除了bin目录中的所有内容)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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

我们必须依赖findstdout,而不是直接依赖它自己的退出代码的原因是,无论是否找到文件,都无法让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的解决方案可能更快,但我还没有测试过它。

票数 50
EN

Stack Overflow用户

发布于 2014-10-08 01:42:42

GNU find可以让你做到这一点

find . -maxdepth 0 -empty -exec echo {} is empty. \;

非常快,而且没有管道

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20456666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档