我需要检查文件夹是否为空,并根据输出运行其他一些命令。我正在使用 Ubuntu 18.04.5 LTS。
我的bash脚本:
if [ "$(ls -A /mnt/mamdrive/"As Metadata"/)" ] || ["$(ls -A /mnt/mamdrive/"As Video"/)" ]; then
echo "copy file"
else
echo "dont copy"
fi
这个条件有时有效,但有时无效,而且很难重现。还有其他方法可以检查目录是否为空并采取相应的措施吗?
答案1
我建议一些不依赖于字符串输出的东西ls
- 例如,测试是否有任何 glob 扩展的结果:
#!/bin/bash
shopt -s nullglob # don't return literal glob if matching fails
shopt -s dotglob # make * match "almost all" like ls -A
set -- /mnt/mamdrive/"As Metadata"/*
if (( $# > 0 )); then
echo "not empty"
else
echo "empty"
fi
如果你想测试两个目录是否都为空,你可以简单地将它们都遍历一遍:
set -- /mnt/mamdrive/"As Metadata"/* /mnt/mamdrive/"As Video"/*
答案2
最简单的方法是使用如下语句ls -A
:if
path=$(ls -A '/whatever/sub directory/more spaces')
if [[ ! -z "$path" ]]; then
echo "Directory is NOT empty!"
else
echo "Directory is empty!"
fi
答案3
find
结合ifne
可以作为空复制:
$ find test/ -maxdepth 0 -empty | ifne cp -t test/ a
在 if 语句中使用它看起来可能像这样:
#!/bin/bash
if find test/ -maxdepth 0 ! -empty | ifne false; then
echo Directory is empty
else
echo Directory is not empty
fi
答案4
众所周知,ls
解析很容易出错,因为它一开始就不是可解析的,所以应该优先考虑其他解决方案。除了@steeldriver的答案外,还可以使用以下方法完成此操作find
:
if [[ "$(find '/mnt/mamdrive/As Metadata' '/mnt/mamdrive/As Video' -maxdepth 1 -mindepth 1 2>/dev/null)" ]]
then
echo “copy file”
else
echo "don't copy"
fi
maxdepth
和mindepth
选项在这里用于仅打印和扫描指定目录的直接子目录。如果某些参数不存在,则重定向可确保不会打印错误消息。
添加多个目录将起到 OR 的作用,因此如果至少一个测试目录非空,则会打印“复制文件”。使用find
还允许使用其参数进行更精细的调整,例如文件名、文件类型等等。