web-dev-qa-db-ja.com

空のサブフォルダを削除し、親フォルダを保持する

私が使うとき

find /home/user/parentdir -type d -empty -delete

/home/user/parentdir内の空のサブフォルダーを再帰的に探して削除します。ただし、/home/user/parentdirも空の場合、parentdirフォルダーも削除されるため、私には望ましくありません。

これをparentdirからrsyncに保持して、バックアップまたはクラウドに保存する必要があります。処理後、空のフォルダーを削除する必要がありますが、parentdirを毎回再作成するのは非生産的です。

parentdirを維持するための提案はありますか?その中に.nocopyファイルを作成してrsyncから除外することを考えましたが、やり過ぎのようです。よりエレガントな方法はありますか?

15
TNT

単にfind /home/user/parentdir -mindepth 1 -type d -empty -delete

見て:

$ mkdir -p test1/test2
$ find test1 -type d
test1
test1/test2
$ find test1 -mindepth 1  -type d
test1/test2

find /home/user/parentdir/*AmourKの回答 は、ファイルが多く、複雑すぎる場合は望ましくありません。

25
chx

parentdirの末尾に/*を追加すると、parentdir自体ではなく、parentdirのすべてのサブディレクトリに対してアクションを実行します。同様に、古いコマンドで/home/user/が削除されないのと同じように、parentdirも以下のコマンドで削除されません。 *はグロブ演算子と呼ばれ、任意の文字列と一致します。

find /home/user/parentdir/* -type d -empty -delete

15
AmourK

php-cliがインストールされている場合、

printf %s $(pwd) | php -r 'function f(string $dir){var_dump($dir);$dir.=DIRECTORY_SEPARATOR;foreach(glob("$dir*",GLOB_ONLYDIR) as $d){f($d);}global $original;if(substr($dir,0,-strlen(DIRECTORY_SEPARATOR))!==$original && empty(glob("$dir*"))){rmdir($dir);}}f(($original=stream_get_contents(STDIN)));'
0
hanshenrik

必要なレベルが1つだけの場合(親フォルダーは残し、空の子フォルダーは削除する)、簡単なトリックはrmdirを使用することです。

rmdir parent/*

空のサブフォルダをすべて削除しますが、ファイルと空でないフォルダのエラーのみを出力します。

これは再帰的には機能しませんが、フォルダ構造を知っているときは、次のようなことをする最も速い方法かもしれません

rmdir parent/*/*/* # deletes parent/a/b/c when empty
rmdir parent/*/* # deletes parent/a/b when it is now empty
rmdir parent/* # deletes parent/a when it is now empty

利点:覚えやすく、すばやく入力でき、間違ったパラメーターを選択する可能性がほとんどありません。
欠点:柔軟性が低く、端末に多くのエラーメッセージが表示される可能性があります。

0
allo