仅删除带有空标志的空文件夹 - 安全吗

仅删除带有空标志的空文件夹 - 安全吗

我们创建以下命令,以便仅删除早于 100 分钟的空文件夹

find /tmp -type  d -empty -mmin +100 -printf '%p was deleted!!\n' -delete

因为我们打算在生产机器上从 cron 作业运行它

我们想了解如果空的标志还将忽略带有链接或空文件的文件夹

或者换句话说如何空标志检查文件夹?

答案1

空就是空的意思。如果目录中有任何类型的文件,则该目录不为空。为了显示:

$ mkdir dir{1..8}; \
  ln -s /etc/ dir1/workingLink; \
  ln -s noSuchFile dir2/brokenLink;  \
  mkfifo dir3/fifo; 
  touch dir4/emptyFile; \
  echo foo > dir5/nonEmptyFile; \
  touch dir6/.hiddenFile; \
  mkdir dir7/subdir
$ tree -a
.
├── dir1
│   └── workingLink -> /etc/
├── dir2
│   └── brokenLink -> noSuchFile
├── dir3
│   └── fifo
├── dir4
│   └── emptyFile
├── dir5
│   └── nonEmptyFile
├── dir6
│   └── .hiddenFile
├── dir7
│   └── subdir
└── dir8

因此,我们有一个带有可用符号链接的目录,一个带有损坏的链接(指向不存在的文件),一个带有 FiFo(命名管道),一个带有空文件,一个带有不存在的文件一个是空的,一个是隐藏文件的,一个是子目录的,只有一个是空的。哪一个会被删除?

$ find . -type d -empty -printf '%p WAS DELETED!\n' -delete \
                        -or -printf '%p: not empty!\n'
./dir8 WAS DELETED!
./dir3/fifo: not empty!
./dir3: not empty!
./dir5/nonEmptyFile: not empty!
./dir5: not empty!
./dir6/.hiddenFile: not empty!
./dir6: not empty!
./dir2/brokenLink: not empty!
./dir2: not empty!
./dir4/emptyFile: not empty!
./dir4: not empty!
./dir7/subdir WAS DELETED!
./dir7 WAS DELETED!
./dir1/workingLink: not empty!
./dir1: not empty!
.: not empty!

因此,删除了三件事:

  1. 空目录dir8
  2. 空(子)目录dir7/subdir
  3. (现在)空目录dir7。之所以被删除,是因为find先被删除dir7/subdir,然后又dir7是空的,所以也被删除了。

因此,目录中的任何类型的内容都会阻止该命令删除它,但您需要小心,以防目录中只有其他空目录。在这种情况下,该find命令还将删除父目录,因为在完成时该目录将为空。

如果您不想删除可能导致父目录被删除的子目录,则可以使用 GNU find(Linux 上的默认设置)使用该-maxdepth标志来限制find仅当前目录:

$ find . -maxdepth 1 -type d -empty -printf '%p WAS DELETED!\n' \
                                    -delete -or -printf '%p: not empty!\n'
./dir8 WAS DELETED!
./dir3: not empty!
./dir5: not empty!
./dir6: not empty!
./dir2: not empty!
./dir4: not empty!
./dir7: not empty!
./dir1: not empty!
.: not empty!

相关内容