Bash 命令查看目录中是否有任何文件 - 测试目录是否为空

标签 bash shell unix

<分区>

我有以下 bash 脚本:

if ls /Users/david/Desktop/empty > /dev/null
then
    echo 'yes -- files'
else
    echo 'no -- files'
fi

如果 /Users/david/Desktop/empty 目录中有一个或多个文件,我将如何修改第一行以使其评估为真?

最佳答案

这在 BashFAQ #004 中有详细介绍.值得注意的是,use of ls for this purpose is an antipattern and should be avoided .

shopt -s dotglob   # if including hidden files is desired
files=( "$dir"/* )
[[ -e $files || -L $files ]] && echo "Directory is not empty"

[[ -e $files ]] 实际上并不检查整个数组的内容是否存在;相反,它会检查返回的名字——处理没有文件匹配的情况,其中 glob 表达式本身作为唯一结果返回。


值得注意的是:

  • 这比调用 ls ,后者需要使用 fork() 生成子 shell,execve()/bin/ls 替换该子 shell ,操作系统的动态链接器加载 ls 二进制文件使用的共享库,等等。 [一个异常(exception)这是非常大的目录,包含数万个文件——在这种情况下 ls 也会很慢;请参阅下面的基于find 的解决方案。
  • 这比调用 ls更正确:通配符返回的文件列表保证与文件的字面名称完全匹配,而 ls 可以使用隐藏字符修改名称。如果第一个条目是一个有效的文件名,"${files[@]}" 可以安全地迭代,并确保每个返回值都是一个名称,并且无需担心文件系统如果本地 ls 实现没有转义它们,则名称中的文字换行符会增加计数。

也就是说,另一种方法是使用 find,如果您有一个带有 -empty 扩展名的方法(可从 GNU find 和现代 BSD(包括 Mac OS)获得):

[[ $(find -H "$dir" -maxdepth 0 -type d -empty) ]] || echo "Directory is not empty"

...如果给出any 结果,则目录为非空。虽然比遍历不是异常大的目录慢,但比 either ls 或遍历目录缓存中不存在的超大目录要快,因为它可以返回结果没有全面扫描。

关于Bash 命令查看目录中是否有任何文件 - 测试目录是否为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35282599/

相关文章:

linux - 在ksh或bash中解析并查找具有UID的进程信息

linux - 使用 tar -cfv 输出 Bash

java - 正则表达式 : Parsing a Large string

mysql - bash脚本中的sql语句 "command not found"

shell - 在 shell 脚本中使用 cut

c - 使用 execlp() 从字符串运行 shell 命令

linux - 内嵌shell不支持重定向: exec 2>>(logger -t myscript)

unix - 如何使用 awk、sed 或其他 unix 命令每隔 n 个间隔获取一个行范围?

bash - Shell:如何用 "Cut"剪切单个字符串?

linux - bash 提示不显示行首