如何递归删除所有不包含任何文件的目录并排除隐藏目录?
我希望删除的许多目录都包含隐藏目录(点目录),其中包含文件,我不想要这些目录。
但是,任何包含实际可见文件的目录 - 我希望保留。
有什么建议么?
示例(我想删除)
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