(我手边没有 Solaris 机器,所以我正在使用联机帮助页,所以您可能需要在这里稍微使用一下语法。)
您可以利用这样一个事实,即任何空目录的链接数为 2(只有目录名本身dir,加上它自己的dir/., 链接);在 UNIX 中,除非在将目录添加到(单个)目录条目或将目录条目添加到目录的过程中,否则(硬)链接到目录是非法的,因此这是一个不变量。(基本上1。)
Solaris不支持的-empty选项,但它不支持-links <n>与准确搜索物品选项ñ链接。所以你想要的命令(我认为;见下文)是:
find /home/.../Desktop -type d -links 2 -print
您对“递归”一词的使用有点含糊不清,因此请注意,这不会找到仅包含空目录(或递归地以此类推)的目录。如果您愿意,那么如果您想识别它们以便删除它们,问题就很容易了。只需重复运行上面的命令,添加-exec rmdir {} \;直到没有剩余;每次运行它时,您都会删除更深一层的树的父级,因此除非您有一个非常深的目录树,否则除了空目录之外什么都没有。(根据 Solaris find(1) 的工作方式,我认为您也可以find . -type d -exec rmdir -p {};只运行一次(该-p选项告诉rmdir(1) 它可以删除包含空目录的目录),但是因为它随后会尝试遍历已删除的目录,您会收到一堆错误消息,您可以忽略这些错误消息以及您可能关心的错误消息,所以我d 以这种迭代方式来代替。)
(请注意,find(1)的-depth选项在这里没有帮助,因为文件stat()过早更新链接计数。否则,您可以运行一次就足够了。)find -depth $dir -type d -links 2 -exec rmdir {} \;
如果你想找出这两个不删除他们“内在的空”目录,并不含任何添加剂的目录,但空目录(或者等等,递归),它是更为复杂的。我认为一个命令行是可能的,但它会是一头野兽(我相信其他人稍后会尝试一下),至少不会诉诸perl或疯狂sed/awk咒语。
但是我要做的是将目录树复制到某个地方,比如/tmp/tree-copy,然后运行命令
find /tmp/tree-copy -type d -links 2 -print -exec rmdir {} \; | tee -a /tmp/empty-dirlist
重复直到它不再产生输出。(这tee -a让您可以看到输出,但也会将其附加到文件/tmp/empty-dirlist 中。)
然后,您需要/tmp/tree-copy从文件的每一行中删除或 任何内容;
perl -i -lpe 's{^/tmp/tree-copy/}{}' /tmp/empty-dirlist
将为此工作,或者您可以使用文本编辑器。瞧!,空目录列表,其中“空”被定义为“只包含目录”。(如果您愿意perl,您也可以将,或sed其他任何东西放入管道中tee -a。)
1(在其他情况下对于目录是非法的)2,或其他有意义但与其实际链接数无关的内容。因此,如果您要执行上述操作,则应检查您是否可能会遍历挂载点,因为其中一个的链接数可能为 2,但可能性不大。| 归档时间: |
|
| 查看次数: |
3536 次 |
| 最近记录: |