1. 空ディレクトリの検索
  2. findで検索した空ディレクトリに対してコマンドを実行

ファイルやディレクトリが無い空のディレクトリを検索したり、それらを削除する方法

空ディレクトリの検索

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/d03
testディレクトリの空ディレクトリを検索する場合は以下を実行します。
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/d03
    testディレクトリが空の場合、何も表示しません。
    $ 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/d02
    findにはオプション-print0 、xargsにはオプション--nullを追加して、スペースなどを含むディレクトリでエラーが発生しないようにします。 また、findで空ディレクトリが0個の場合、xargs側でコマンドの引数無しによるエラーが発生するので、xargsにオプション-rを追加してfindの検索結果が0個の場合に実行しないようにします。