<分区>
我有以下 bash 脚本:
if ls /Users/david/Desktop/empty > /dev/null
then
echo 'yes -- files'
else
echo 'no -- files'
fi
如果 /Users/david/Desktop/empty
目录中有一个或多个文件,我将如何修改第一行以使其评估为真?
<分区>
我有以下 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/