因此,我有以下 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