ディレクトリの特定のリストから空のディレクトリを見つける必要があります。一部のディレクトリには、内部にディレクトリがあります。
内部ディレクトリも空の場合、メインディレクトリは空であると言えます。それ以外の場合は空ではありません。
これをどのようにテストできますか?
例えば:
A>A1(file1),A2 this is not empty beacuse of file1
B>B1(no file) this is empty
C>C1,C2 this is empty
かどうか確かめる find <dir> -type f
は何でも出力します。ここに例があります:
for dir in A B C; do
[ -z "`find $dir -type f`" ] && echo "$dir is empty"
done
空のディレクトリをどうするかによって少し異なります。 deleteツリー内のすべての空のディレクトリ、たとえばtest
ディレクトリを使用する場合は、以下のコマンドを使用します。
find test -depth -empty -delete
上記のコマンドについて注意すべきことの1つは、空のファイルも削除するであるため、-type dオプションを使用してそれを避けてください。
find test -depth -type d -empty -delete
-delete
をドロップして、一致したファイルとディレクトリを表示します。
空のディレクトリツリーの定義にファイルが含まれていない場合、find test -type f
が何かを返すかどうかに基づいて何かを結び付けることができます。
find
は優れたユーティリティであり、RTFM早い段階で、多くの場合実際にそれができることを理解するために:-)
次のコマンドを使用できます。
find . -type d -empty
find directory -mindepth 1 -type d -empty -delete
これは私が最もおもしろいと思ったバージョンです。 ディレクトリの内部から実行すると、下のすべての空のディレクトリが削除されます(空のディレクトリのみが含まれる場合、ディレクトリは空と見なされます)。
Mindepthオプションは、ディレクトリが空の場合にディレクトリ自体が削除されないようにします。
find . -type d -empty
現在のツリーで空のディレクトリとサブディレクトリを見つけてリストします。例えば。結果の空のディレクトリとサブディレクトリのリスト:
./2047
./2032
./2049
./2063
./NRCP26LUCcct1/2039
./NRCP26LUCcct1/2054
./NRCP26LUCcct1/2075
./NRCP26LUCcct1/2070
ディレクトリに対して操作は行われません。それらは単にリストされています。これは私のために動作します。
(質問のタイトルで指定されているように)空のディレクトリを見つけるには、 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つの異なるテクニックを提供します。
[ $(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
_
_(( ${#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
_
注:空のディレクトリと存在しないディレクトリの間に違いはありません(提供されたパスがファイルの場合でも)。
[ $(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
_を返します。ただし、ファイルと空のディレクトリに違いはありません。
この再帰関数は、トリックを行うように思われます:
# 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
の後、関数はそのディレクトリを結果に含めます。
rmdir *
?そのコマンドは、空でないディレクトリでは失敗します。
次のように単純な構造を作成しました。
test/
test/test2/
test/test2/test2.2/
test/test3/
test/test3/file
test/test3/file
にはジャンクテキストが含まれています。
find test -empty
を発行すると、「test/test2/test2.2
」が唯一の空のディレクトリとして返されます。
簡単なアプローチは、
$ [ "$(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"
find . -name -type d -ls |awk '($2==0){print $11}'