如何检查文件夹是否为空并在 if-then-else 语句中使用其内容?

如何检查文件夹是否为空并在 if-then-else 语句中使用其内容?

我需要检查文件夹是否为空,并根据输出运行其他一些命令。我正在使用 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 -Aif

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

maxdepthmindepth选项在这里用于仅打印和扫描指定目录的直接子目录。如果某些参数不存在,则重定向可确保不会打印错误消息。

添加多个目录将起到 OR 的作用,因此如果至少一个测试目录非空,则会打印“复制文件”。使用find还允许使用其参数进行更精细的调整,例如文件名、文件类型等等。

相关内容