我们创建以下命令,以便仅删除早于 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!
因此,删除了三件事:
- 空目录
dir8
。 - 空(子)目录
dir7/subdir
- (现在)空目录
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!