ファイルやディレクトリが無い空のディレクトリを検索したり、それらを削除する方法
空ディレクトリの検索
findコマンドでファイルやディレクトリを持たない空ディレクトリを探す場合、オプション -emptyとオプション -type d を指定します。
find [検索するディレクトリ] -type d -empty [その他オプション]
また、検索に指定したディレクトリが空の時、何も表示したくない場合はオプションに -mindepth 1 も追加します。
find [検索するディレクトリ] -mindepth 1 -type d -empty [その他オプション]
注意 オプション -mindepth を、オプション -type やオプション -empty の後ろに指定するとエラーになります。
mkdir -p test/aaa mkdir -p test/bbb/b01 mkdir -p test/ccc/c01/c02 mkdir -p test/ddd/d01/d02/d03testディレクトリの空ディレクトリを検索する場合は以下を実行します。
find test -type d -empty実行結果は以下のようになります。
$ find test -type d -empty test/aaa test/bbb/b01 test/ccc/c01/c02 test/ddd/d01/d02/d03
注意 検索するディレクトリが空の場合、検索対象のディレクトリが表示されます。
$ mkdir test $ ls -l test/ 合計 0 $ find test -type d -empty test上記でtestディレクトリは空です。空のディレクトリを検索ディレクトリに指定した場合、指定したパスがそのまま表示されます。
$ find ./test -type d -empty ./test
検索対象のディレクトリが空の時、何も表示したくない場合は、オプションに -mindepth 1 を追加します。
$ find ./test -mindepth 1 -type d -empty
注意 オプション -mindepth を、オプション -type やオプション -empty の後ろに指定するとエラーになります。
-
指定階層までのディレクトリは対象外とする
例えば、検索ディレクトリのN階層目までのディレクトリが空でも表示しない場合、オプションに -mindepth にN+1の整数を指定します。
例 testディレクトリの中の1階層目のディレクトリが空の場合に表示しないとき
$ find test -mindepth 2 -type d -empty test/bbb/b01 test/ccc/c01/c02 test/ddd/d01/d02/d03上記では、test/aaa ディレクトリが空ですが表示れていません。
例 2階層目のディレクトリまで対象外とする場合、-mindepth に3を指定します。
$ find test -mindepth 3 -type d -empty test/ccc/c01/c02 test/ddd/d01/d02/d03
-mindepthに1を指定した場合、検索ディレクトリが空の場合に何も表示しなくなるだけです。 検索ディレクトリが空でなければ、その下のディレクトリの中から空のディレクトリを表示します。
$ find test -mindepth 1 -type d -empty test/aaa test/bbb/b01 test/ccc/c01/c02 test/ddd/d01/d02/d03testディレクトリが空の場合、何も表示しません。
$ find test -mindepth 1 -type d -empty
findで検索した空ディレクトリに対してコマンドを実行
findで検索した空ディレクトリを削除などする場合、findのオプション-exec を使う方法とxargsコマンドを使う方法があります。
find [検索するディレクトリ] -mindepth 1 -type d -empty [その他オプション] -exec [削除などのコマンド] {} \;
find [検索するディレクトリ] -mindepth 1 -type d -empty [その他オプション] -print0 | xargs -r --null [削除などのコマンド]注意 xargsを使用する場合、findにはオプション-print0 、xargsにはオプション--nullを追加して、スペースなどを含むディレクトリでエラーが発生しないようにします。 また、findで空ディレクトリが0個の場合、xargs側でコマンドの引数無しによるエラーが発生するので、xargsにオプション-rを追加してfindの検索結果が0個の場合に実行しないようにします。
-
findで検索した空ディレクトリの情報表示(ls)
findのオプション-execを使用した空ディレクトリへのls実行は以下になります。
find test -type d -empty -exec ls -ld {} \;例
$ find test -type d -empty -exec ls -ld {} \; drwxrwxrwx 1 vagrant vagrant 0 5月 12 22:17 test/ 半角 スペース drwxrwxrwx 1 vagrant vagrant 0 5月 12 22:17 test/aaa drwxrwxrwx 1 vagrant vagrant 0 5月 12 22:17 test/bbb/b01 drwxrwxrwx 1 vagrant vagrant 0 5月 12 22:17 test/ccc/c01/c02 drwxrwxrwx 1 vagrant vagrant 0 5月 12 22:17 test/ddd/d01/d02/d03 drwxrwxrwx 1 vagrant vagrant 0 5月 12 22:17 test/ 全角 スペース
xargsを使用した空ディレクトリへのls実行は以下になります。
find test -type d -empty -print0 | xargs -r --null ls -ld例
$ find test -type d -empty -print0 | xargs -r --null ls -ld drwxrwxrwx 1 vagrant vagrant 0 5月 12 22:17 test/ 半角 スペース drwxrwxrwx 1 vagrant vagrant 0 5月 12 22:17 test/aaa drwxrwxrwx 1 vagrant vagrant 0 5月 12 22:17 test/bbb/b01 drwxrwxrwx 1 vagrant vagrant 0 5月 12 22:17 test/ccc/c01/c02 drwxrwxrwx 1 vagrant vagrant 0 5月 12 22:17 test/ddd/d01/d02/d03 drwxrwxrwx 1 vagrant vagrant 0 5月 12 22:17 test/ 全角 スペース
findで検索した空ディレクトリを削除(rmdir)
注意 findの検索結果を削除する場合、いきなり"rmdir" や "rm -rf"を指定せずに、ファイルでは"ls -l"、ディレクトリでは"ls -ld"を指定して想定されているファイルやディレクトリが対象になるか確認した方が安全です。
-execを使用した空ディレクトリ削除は以下になります。 ただし、削除できたディレクトリに関係したエラーメッセージが表示されます。
find test -mindepth 1 -type d -empty -exec rmdir {} \;例。
$ find test -mindepth 1 -type d -empty -exec ls -ld {} \; drwxrwxrwx 1 vagrant vagrant 0 5月 13 2018 test/ 半角 スペース drwxrwxrwx 1 vagrant vagrant 0 5月 13 21:53 test/aaa drwxrwxrwx 1 vagrant vagrant 0 5月 13 21:53 test/bbb/b01 drwxrwxrwx 1 vagrant vagrant 0 5月 13 21:53 test/ccc/c01/c02 drwxrwxrwx 1 vagrant vagrant 0 5月 13 21:53 test/ddd/d01/d02/d03 drwxrwxrwx 1 vagrant vagrant 0 5月 13 21:53 test/ 全角 スペース $ find test -mindepth 1 -type d -empty -exec rmdir {} \; find: ‘test/ 半角 スペース’: そのようなファイルやディレクトリはありません find: ‘test/aaa’: そのようなファイルやディレクトリはありません find: ‘test/bbb/b01’: そのようなファイルやディレクトリはありません find: ‘test/ccc/c01/c02’: そのようなファイルやディレクトリはありません find: ‘test/ddd/d01/d02/d03’: そのようなファイルやディレクトリはありません find: ‘test/ 全角 スペース’: そのようなファイルやディレクトリはありません $ find test -mindepth 1 -type d -empty -exec ls -ld {} \; drwxrwxrwx 1 vagrant vagrant 0 5月 13 21:53 test/bbb drwxrwxrwx 1 vagrant vagrant 0 5月 13 21:53 test/ccc/c01 drwxrwxrwx 1 vagrant vagrant 0 5月 13 21:53 test/ddd/d01/d02
xargsを使用した空ディレクトリ削除は以下になります。
find test -mindepth 1 -type d -empty -print0 | xargs -r --null rmdir例
$ find test -type d -empty -print0 | xargs -r --null ls -ld drwxrwxrwx 1 vagrant vagrant 0 5月 13 21:53 test/ 半角 スペース drwxrwxrwx 1 vagrant vagrant 0 5月 13 21:53 test/aaa drwxrwxrwx 1 vagrant vagrant 0 5月 13 21:53 test/bbb/b01 drwxrwxrwx 1 vagrant vagrant 0 5月 13 21:53 test/ccc/c01/c02 drwxrwxrwx 1 vagrant vagrant 0 5月 13 21:53 test/ddd/d01/d02/d03 drwxrwxrwx 1 vagrant vagrant 0 5月 13 21:53 test/ 全角 スペース $ find test -mindepth 1 -type d -empty -print0 | xargs -r --null rmdir $ find test -type d -empty -print0 | xargs -r --null ls -ld drwxrwxrwx 1 vagrant vagrant 0 5月 13 2018 test/bbb drwxrwxrwx 1 vagrant vagrant 0 5月 13 2018 test/ccc/c01 drwxrwxrwx 1 vagrant vagrant 0 5月 13 2018 test/ddd/d01/d02findにはオプション-print0 、xargsにはオプション--nullを追加して、スペースなどを含むディレクトリでエラーが発生しないようにします。 また、findで空ディレクトリが0個の場合、xargs側でコマンドの引数無しによるエラーが発生するので、xargsにオプション-rを追加してfindの検索結果が0個の場合に実行しないようにします。