ドットファイル/ディレクトリ除外を使用して空のディレクトリを繰り返し削除しますか?

ドットファイル/ディレクトリ除外を使用して空のディレクトリを繰り返し削除しますか?

ファイルが含まれていないすべてのディレクトリを再帰的に削除し、隠しディレクトリを除外する方法は?

削除するディレクトリの多くには、不要なファイルを含む隠しディレクトリ(ドットディレクトリ)が含まれています。

ただし、実際に表示されるファイルを含むすべてのディレクトリは維持したいと思います。

どんな提案がありますか?

例(削除したい)

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
  • 上記の各一致に対して(一度に1つずつ)、bashシェルを実行します。
    • セットnullglob シェルオプション dotglob シェルオプションが次のようになっていることを確認します。未設定
    • シェルglobを使用して、$1/*位置引数を一致するディレクトリ内の一致するファイル(および/またはディレクトリ)の数に設定します。 dotglob を設定しない場合は bash に通知します。いいえ拡張でドットファイル(またはドットディレクトリ)を評価し、nullglobオプションを使用すると、globは次に展開されます。何もないまったく一致しない場合。
    • 結果ファイル/ディレクトリの数が0の場合、「成功」を返します。
  • 上記のテストに合格したディレクトリに対してコマンドが実行されたときに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

関連情報