使用点文件/目录排除递归删除空目录?

使用点文件/目录排除递归删除空目录?

如何递归删除所有不包含任何文件的目录并排除隐藏目录?

我希望删除的许多目录都包含隐藏目录(点目录),其中包含文件,我不想要这些目录。

但是,任何包含实际可见文件的目录 - 我希望保留。

有什么建议么?

示例(我想删除)

v@localhost:~/test$ ls -al
total 20
drwxrwxr-x   3 v v  4096 Oct 28 04:31 .
drwxr-xr-x 255 v v 12288 Oct 28 04:38 ..
drwxrwxr-x   4 v v  4096 Oct 28 04:31 .hidden

示例(我希望保留)

v@localhost:~/google.com$ ls -al
total 348
drwxrwxr-x   6 v v   4096 Oct 28 04:39 .
drwxr-xr-x 255 v v  12288 Oct 28 04:38 ..
-rw-rw-r--   1 v v     54 Oct 28 04:39 BCF9360BE20A13B7DA407BF12AF28650.txt
-rw-rw-r--   1 v v    254 Oct 28 04:39 crossdomain.xml
-rw-rw-r--   1 v v   1150 Oct 28 04:39 favicon.ico
-rw-rw-r--   1 v v    234 Oct 28 04:39 .htaccess
-rw-rw-r--   1 v v     23 Oct 28 04:39 index.html
-rw-rw-r--   1 v v    418 Oct 28 04:39 index.php
-rw-rw-r--   1 v v  19935 Oct 28 04:39 license.txt
-rw-rw-r--   1 v v 110249 Oct 28 04:39 php_errors.log
-rw-rw-r--   1 v v   7344 Oct 28 04:39 readme.html
-rw-rw-r--   1 v v   5456 Oct 28 04:39 wp-activate.php
drwxrwxr-x   9 v v   4096 Oct 28 04:39 wp-admin
-rw-rw-r--   1 v v    364 Oct 28 04:39 wp-blog-header.php
-rw-rw-r--   1 v v   1477 Oct 28 04:39 wp-comments-post.php
-rw-rw-r--   1 v v   3376 Oct 28 04:39 wp-config-local.php
-rw-rw-r--   1 v v   5219 Oct 28 04:39 wp-config.php
-rw-rw-r--   1 v v   2853 Oct 28 04:39 wp-config-sample.php
drwxrwxr-x   7 v v   4096 Oct 28 04:39 wp-content
-rw-rw-r--   1 v v   3286 Oct 28 04:39 wp-cron.php
drwxrwxr-x  17 v v  12288 Oct 28 04:39 wp-includes
-rw-rw-r--   1 v v   2382 Oct 28 04:39 wp-links-opml.php
-rw-rw-r--   1 v v   3353 Oct 28 04:39 wp-load.php
-rw-rw-r--   1 v v  34057 Oct 28 04:39 wp-login.php
-rw-rw-r--   1 v v   7993 Oct 28 04:39 wp-mail.php
-rw-rw-r--   1 v v  13920 Oct 28 04:39 wp-settings.php
-rw-rw-r--   1 v v  29890 Oct 28 04:39 wp-signup.php
-rw-rw-r--   1 v v   4035 Oct 28 04:39 wp-trackback.php
-rw-rw-r--   1 v v   3064 Oct 28 04:39 xmlrpc.php

答案1

rmdir不会删除非空目录,因此您可以执行以下操作:

find . -type d \! -name '.*' -depth -exec rmdir -v --ignore-fail-on-non-empty {} \;

(哪里--ignore-fail-on-non-empty只是关于错误消息......)

答案2

它变得有点复杂,但是您可以将一些find测试链接在一起,即:

  • 从所需目录开始 ( /path/to/dir)
  • 从下往上开始 ( -depth),以便在考虑其父目录之前清空候选目录
  • 只考虑目录 ( -type d)
  • 对于上述每个匹配项(一次一个),执行 bash shell:
    • nullglob shell 选项确保 dotglob shell 选项是未设置
    • 使用$1/*shell glob 将位置参数设置为匹配目录中匹配文件(和/或目录)的数量 - 请注意,取消设置 dotglob 告诉 bash不是计算扩展中的点文件(或点目录),并且 nullglob 选项将使 glob 扩展为没有什么如果根本没有匹配项。
    • 如果结果文件/目录的数量为零,则返回“成功”
  • 对于通过上述测试的任何目录,在它们上执行一次命令rm -r所容纳的数量( )。rm+

加起来:

find /path/to/dir -depth -type d \
  -exec bash -c \
     'shopt -s nullglob; shopt -u dotglob; set -- $1/*; test "$#" -eq 0' find-sh {} \; \
  -exec rm -r {} +

Stéphane 的查找/执行答案在这里为这个答案提供了一个很好的起点。

创建测试台:

mkdir tmp
cd tmp
mkdir dir{1..3}
touch dir1/.hidden
touch dir2/foo
touch dir3/bar

相关内容