我如何检查 for 循环中的目录/文件是否为空?

我如何检查 for 循环中的目录/文件是否为空?

因此,我有以下 for 循环,它进入每个目录,如果该目录为空,它应该离开它并且不执行任何操作。但是,如果目录不为空,它应该将其内容向上移动 1 个位置并删除剩余的空目录,但我不知道该怎么说:如果 [$i 是空的] 然后 ....

    for i in */*/
    do
      cd "$i"
    if [ -d "$i" ]
    then
        :
    else
        mv ./* ..
        cd -
        rmdir "$i"
    fi
done

答案1

您可以将目录内容扩展为一个数组(可移植地,使用 shell 的位置参数数组),然后测试它有多少个元素,例如

#!/bin/bash

shopt -s nullglob
for d in */; do
  set -- "$d"/*
  [ $# -gt 0 ] || continue
  printf '%s: is non-empty\n' "$d"
done

如果要包含隐藏文件,请更改shopt -s nullglob为。shopt -s nullglob dotglob

如果您不喜欢使用位置参数数组,bash 更普遍地支持数组,例如

#!/bin/bash

shopt -s nullglob
for d in */; do
  files=( "$d"/* )
  [ ${#files[@]} -gt 0 ] || continue
  printf '%s: is non-empty\n' "$d"
done

相关内容