web-dev-qa-db-ja.com

空のディレクトリの検索UNIX

ディレクトリの特定のリストから空のディレクトリを見つける必要があります。一部のディレクトリには、内部にディレクトリがあります。

内部ディレクトリも空の場合、メインディレクトリは空であると言えます。それ以外の場合は空ではありません。

これをどのようにテストできますか?

例えば:

A>A1(file1),A2 this is not empty beacuse of file1
B>B1(no file) this is empty
C>C1,C2 this is empty
88
soField

かどうか確かめる find <dir> -type fは何でも出力します。ここに例があります:

for dir in A B C; do
    [ -z "`find $dir -type f`" ] && echo "$dir is empty"
done
33
Marcelo Cantos

空のディレクトリをどうするかによって少し異なります。 deleteツリー内のすべての空のディレクトリ、たとえばtestディレクトリを使用する場合は、以下のコマンドを使用します。

find test -depth -empty -delete

上記のコマンドについて注意すべきことの1つは、空のファイルも削除するであるため、-type dオプションを使用してそれを避けてください。

find test -depth -type d -empty -delete

-deleteをドロップして、一致したファイルとディレクトリを表示します。

空のディレクトリツリーの定義にファイルが含まれていない場合、find test -type fが何かを返すかどうかに基づいて何かを結び付けることができます。

findは優れたユーティリティであり、RTFM早い段階で、多くの場合実際にそれができることを理解するために:-)

244
Martin

次のコマンドを使用できます。

find . -type d -empty
41
mosg
find directory -mindepth 1 -type d -empty -delete

これは私が最もおもしろいと思ったバージョンです。 ディレクトリの内部から実行すると、下のすべての空のディレクトリが削除されます(空のディレクトリのみが含まれる場合、ディレクトリは空と見なされます)。

Mindepthオプションは、ディレクトリが空の場合にディレクトリ自体が削除されないようにします。

25

find . -type d -empty

現在のツリーで空のディレクトリとサブディレクトリを見つけてリストします。例えば。結果の空のディレクトリとサブディレクトリのリスト:

./2047
./2032
./2049
./2063
./NRCP26LUCcct1/2039
./NRCP26LUCcct1/2054
./NRCP26LUCcct1/2075
./NRCP26LUCcct1/2070

ディレクトリに対して操作は行われません。それらは単にリストされています。これは私のために動作します。

22
user7194913

空のディレクトリを見つける

(質問のタイトルで指定されているように)空のディレクトリを見つけるには、 mosg's answer が正しい:

_find -type d -empty
_

ただし、_-empty_は非常に古いfindバージョンでは使用できない場合があります(これは HP-UX の場合です)。この場合は、以下のセクションで説明されているテクニックを参照してくださいディレクトリは空ですか?.

空のディレクトリを削除する

これは少し注意が必要です。ディレクトリMyDirに空のディレクトリが含まれているとします。これらの空のディレクトリを削除すると、MyDirは空のディレクトリになり、削除する必要があります。したがって、コマンドrmdirをオプション_--parents_(または_-p_)とともに使用します。これは、可能な場合は親ディレクトリも削除します。

_find -type d -empty -exec rmdir -vp --ignore-fail-on-non-empty {} +
_

古いfindバージョンでは、ステートメント_+_はまだサポートされていないため、代わりに_;_を使用できます。

_find -type d -empty -exec rmdir -vp --ignore-fail-on-non-empty {} `;`
_

ディレクトリは空ですか?

これらの回答のほとんどは、ディレクトリが空かどうかを確認する方法を説明しています。したがって、ここで私が知っている3つの異なるテクニックを提供します。

  1. [ $(find your/dir -Prune -empty) = your/dir ]

    _d=your/dir
    if [ x$(find "$d" -Prune -empty) = x"$d" ]
    then
      echo "empty (directory or file)"
    else
      echo "contains files (or does not exist)"
    fi
    _

    バリエーション:

    _d=your/dir
    if [ x$(find "$d" -Prune -empty -type d) = x"$d" ]
    then
      echo "empty directory"
    else
      echo "contains files (or does not exist or is not a directory)"
    fi
    _

    説明:

    • _find -Prune_は、使用する文字数が少ない_find -maxdepth 0_と似ています
    • _find -type d_はディレクトリのみを出力します
    • _find -empty_は空のディレクトリとファイルを出力します

      _> mkdir -v empty1 empty2 not_empty
      mkdir: created directory 'empty1'
      mkdir: created directory 'empty2'
      mkdir: created directory 'not_empty'
      > touch not_empty/file
      > find empty1 empty2 not_empty -Prune -empty
      empty1
      empty2
      _
  2. _(( ${#files} ))_

    このトリックは100%bashですが、サブシェルを呼び出します(スポーンします)。アイデアは Bruno De Fraine からのもので、 teambob のコメントによって改善されました。 bash を使用し、スクリプトを移植する必要がない場合は、この方法をお勧めします。

    _files=$(shopt -s nullglob dotglob; echo your/dir/*)
    if (( ${#files} ))
    then 
      echo "contains files"
    else 
      echo "empty (or does not exist or is a file)"
    fi
    _

    注:空のディレクトリと存在しないディレクトリの間に違いはありません(提供されたパスがファイルの場合でも)。

  3. [ $(ls -A your/dir) ]

    このトリックは nixCraftの記事 2007年に投稿されました。 Andrew Taylor 2008年に回答 gr8can8dian 2011年に。

    _if [ "$(ls -A your/dir)" ]
    then
      echo "contains files"
    else
      echo "empty (or does not exist or is a file)"
    fi
    _

    または1行のbashismバージョン:

    _[[ "$(ls -A your/dir)" ]] && echo "contains files" || echo "empty or ..."
    _

    注:lsは、ディレクトリが存在しない場合に_$?=2_を返します。ただし、ファイルと空のディレクトリに違いはありません。

16
olibre

この再帰関数は、トリックを行うように思われます:

# Bash
findempty() {
    find ${1:-.} -mindepth 1 -maxdepth 1 -type d | while read -r dir
    do
        if [[ -z "$(find "$dir" -mindepth 1 -type f)" ]] >/dev/null
        then
            findempty "$dir"
            echo "$dir"
        fi
    done
}

このディレクトリ構造の例を考えると:

。
 |-dir1 /
 |-dir2 /
 | `-dirB /
 |-dir3 /
 | `-dirC /
 | `-file5 
 |-dir4 /
 | |-dirD /
 | `-file4 
`-dir5 /
 `-dirE /
`-dir_V /

その関数を実行した結果は次のようになります。

 ./dir1
 ./dir5/dirE/dir_V
 ./dir5/dirE
 ./dir5
 ./dir2/dirB 
 ./dir2

/dir4/dirD。再帰呼び出しを移動するとfindempty "$dir"fiの後、関数はそのディレクトリを結果に含めます。

2

rmdir *?そのコマンドは、空でないディレクトリでは失敗します。

1
evandrix

次のように単純な構造を作成しました。


test/
test/test2/
test/test2/test2.2/
test/test3/
test/test3/file

test/test3/fileにはジャンクテキストが含まれています。

find test -emptyを発行すると、「test/test2/test2.2」が唯一の空のディレクトリとして返されます。

0
James Sumners

簡単なアプローチは、

$ [ "$(ls -A /path/to/direcory)" ] && echo "not empty" || echo "its empty"

また、

if [ "$(ls -A /path/to/direcory)" ]; then
   echo "its not empty"
else 
   echo "empty directory"
0
phoenix24
find . -name -type d -ls |awk '($2==0){print $11}'
0
Vijay