私が使うとき
find /home/user/parentdir -type d -empty -delete
/home/user/parentdir
内の空のサブフォルダーを再帰的に探して削除します。ただし、/home/user/parentdir
も空の場合、parentdir
フォルダーも削除されるため、私には望ましくありません。
これをparentdir
からrsync
に保持して、バックアップまたはクラウドに保存する必要があります。処理後、空のフォルダーを削除する必要がありますが、parentdir
を毎回再作成するのは非生産的です。
parentdir
を維持するための提案はありますか?その中に.nocopy
ファイルを作成してrsync
から除外することを考えましたが、やり過ぎのようです。よりエレガントな方法はありますか?
単に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の回答 は、ファイルが多く、複雑すぎる場合は望ましくありません。
parentdir
の末尾に/*
を追加すると、parentdir
自体ではなく、parentdirのすべてのサブディレクトリに対してアクションを実行します。同様に、古いコマンドで/home/user/
が削除されないのと同じように、parentdir
も以下のコマンドで削除されません。 *
はグロブ演算子と呼ばれ、任意の文字列と一致します。
find /home/user/parentdir/* -type d -empty -delete
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)));'
必要なレベルが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
利点:覚えやすく、すばやく入力でき、間違ったパラメーターを選択する可能性がほとんどありません。
欠点:柔軟性が低く、端末に多くのエラーメッセージが表示される可能性があります。