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

yae*_*ael 1 linux bash find shell-script

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

find /tmp -type  d -empty -mmin +100 -printf '%p was deleted!!\n' -delete
Run Code Online (Sandbox Code Playgroud)

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

我们想了解标志是否也会忽略带有链接或空文件的文件夹

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

ter*_*don 5

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

$ 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
Run Code Online (Sandbox Code Playgroud)

因此,我们有一个带有工作符号链接的目录,一个带有断开的链接(指向一个不存在的文件),一个带有 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!
Run Code Online (Sandbox Code Playgroud)

因此,删除了三件事:

  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!
Run Code Online (Sandbox Code Playgroud)