无法编写 Bash 脚本来检查目录是否为空,如果为空则将其删除

Having trouble writing a Bash script that checks if a directory is empty and deletes it if it is

脚本正在搜索早于 x 的文件,将文件和父目录复制到新目录并删除源文件 + 目录(如果它是空的)。如果为空,则换成上面的dir再检查。

复制文件和目录有效,删除文件也有效,但检查目录是否为空则无效,它们只是保持为空。

#!/bin/bash
SOURCE=/root/Desktop
DESTINATION=/Backup
find $SOURCE -type f -amin +1 -exec ./move_file.sh {} $DESTINATION \;

move_file.sh

#!/bin/bash
PFAD=`dirname `
mkdir -p $PFAD
cp  
rm 
while [ `ls -a $PFAD | wc -l` -le 2 ]
do
echo $PFAD ist leer und wird gelöscht
rmdir $PFAD
$PFAD=`echo $PFAD | rev | cut -d/ -f2- | rev`
done

问题应该在 while 循环中。

rmdir不会删除不为空的目录,所以您可以用

一次完成检查和删除
while rmdir "$PFAD" 2>/dev/null; do
  echo "$PFAD ist leer und wird gelöscht"
  PFAD="$(dirname "$PFAD")"
done

如果目录不为空并且 rmdir 拒绝删除它,2> /dev/null 会抑制您收到的错误消息。

注意

开头的美元符号
$PFAD=`echo $PFAD | rev | cut -d/ -f2- | rev`

是一个问题,因为它将命令的输出分配给以 $PFAD 的内容命名的变量。它可以通过删除美元符号来解决,但是 dirname 用于处理目录并且更适合该任务。不过,您可能应该注意测试 .,以防万一您使用相对路径并且当前工作目录最终为空,并且可能 /。虽然,如果 / 最终为空,脚本将 运行 在无限目录名循环成为问题之前陷入困境。

类似于

while [ "$(ls -A $PFAD)" ]

检查空目录的最简单方法

[ "$(ls -A /x/y/z)" ] && echo "Is Not Empty" || echo "Is Empty"