シェルスクリプトから、ディレクトリにファイルが含まれているかどうかを確認するにはどうすればよいですか?
これに似たもの
if [ -e /some/dir/* ]; then echo "huzzah"; fi;
ただし、ディレクトリに1つまたは複数のファイルが含まれている場合は機能します(上記のファイルは正確に0または1つのファイルでのみ機能します)。
これまでのソリューションではls
. すべてのbashソリューションは次のとおりです。
#!/bin/bash
shopt -s nullglob dotglob # To include hidden files
files=(/some/dir/*)
if [ ${#files[@]} -gt 0 ]; then echo "huzzah"; fi
以下はどうでしょう。
if find /some/dir/ -maxdepth 0 -empty | read v; then echo "Empty dir"; fi
この方法では、ディレクトリの内容の完全なリストを生成する必要はありません。はread
、出力を破棄し、何かが読み取られた場合 (つまり/some/dir/
、 によって空が検出された場合) にのみ式を真に評価するようにしますfind
。
試す:
if [ ! -z `ls /some/dir/*` ]; then echo "huzzah"; fi
たくさんのファイルがあるディレクトリには注意してください! コマンドの評価には時間がかかる場合がありls
ます。
IMO 最良の解決策は、
find /some/dir/ -maxdepth 0 -empty
# Works on hidden files, directories and regular files
### isEmpty()
# This function takes one parameter:
# $1 is the directory to check
# Echoes "huzzah" if the directory has files
function isEmpty(){
if [ "$(ls -A $1)" ]; then
echo "huzzah"
else
echo "has no files"
fi
}
DIR="/some/dir"
if [ "$(ls -A $DIR)" ]; then
echo 'There is something alive in here'
fi
これの出力を比較していただけますか?
ls -A /some/dir | wc -l
これは本当に遅い応答かもしれませんが、ここにうまくいく解決策があります。この行は、ファイルの存在のみを認識します。ディレクトリが存在する場合、誤検知は発生しません。
if find /path/to/check/* -maxdepth 0 -type f | read
then echo "Files Exist"
fi
# ディレクトリに非表示でないファイルが含まれているかどうかを確認します。 # # 使い方: if isempty "$HOME"; 次に、「お帰りなさい」とエコーします。フィ # isempty() { $1/* の _ief の場合。行う if [ -e "$_ief" ]; それから リターン 1 フィ 終わり 0 を返す }
いくつかの実装上の注意:
for
ループは、外部ls
プロセスへの呼び出しを回避します。それでも、すべてのディレクトリ エントリを 1 回読み取ります。これは、readdir() を明示的に使用する C プログラムを作成することによってのみ最適化できます。test -e
内側は、空のディレクトリのケースをキャッチします。その場合、変数_ief
には値「somedir/*」が割り当てられます。そのファイルが存在する場合にのみ、関数は「空でない」を返しますtest
をサポートしていません。-e
これにより、ディレクトリが空かどうか、そうでない場合は含まれているファイルの数がわかります。
directory="/some/dir"
number_of_files=$(ls -A $directory | wc -l)
if [ "$number_of_files" == "0" ]; then
echo "directory $directory is empty"
else
echo "directory $directory contains $number_of_files files"
fi
ブルーノの答えの小さなバリエーション:
files=$(ls -1 /some/dir| wc -l)
if [ $files -gt 0 ]
then
echo "Contains files"
else
echo "Empty"
fi
わたしにはできる
空のディレクトリに関する Wooledge ガイドが言及されていないことに驚いています。このガイド、そして実際のウールエッジのすべては、シェルタイプの質問のために読む必要があります.
そのページからの注意事項:
ls 出力を解析しようとしないでください。ls -A ソリューションでさえ壊れる可能性があります (たとえば、HP-UX では、root の場合、ls -A は、root でない場合とは正反対の動作をします。バカ)。
実際、直接の質問を完全に避けたいと思うかもしれません。通常、ディレクトリが空かどうかを知りたいのは、ディレクトリ内のファイルに関係する何かをしたいなどです。より大きな質問に目を向けてください。たとえば、次の検索ベースの例のいずれかが適切なソリューションになる場合があります。
# Bourne
find "$somedir" -type f -exec echo Found unexpected file {} \;
find "$somedir" -maxdepth 0 -empty -exec echo {} is empty. \; # GNU/BSD
find "$somedir" -type d -empty -exec cp /my/configfile {} \; # GNU/BSD
ほとんどの場合、本当に必要なのは次のようなものだけです。
# Bourne
for f in ./*.mpg; do
test -f "$f" || continue
mympgviewer "$f"
done
つまり、質問者は、mympgviewer: ./*.mpg: No such file or directory のようなエラー メッセージを回避するために、明示的な空のディレクトリ テストが必要であると考えた可能性がありますが、実際にはそのようなテストは必要ありません。
bashでの簡単な答え:
if [[ $(ls /some/dir/) ]]; then echo "huzzah"; fi;
プルーンのものと最後の答えを混ぜ合わせて、私は
find "$some_dir" -prune -empty -type d | read && echo empty || echo "not empty"
スペースを含むパスでも機能します
if ls /some/dir/* >/dev/null 2>&1 ; then echo "huzzah"; fi;
特定のターゲット ディレクトリをテストするには
if [ -d $target_dir ]; then
ls_contents=$(ls -1 $target_dir | xargs);
if [ ! -z "$ls_contents" -a "$ls_contents" != "" ]; then
echo "is not empty";
else
echo "is empty";
fi;
else
echo "directory does not exist";
fi;
ls - A
投稿されたソリューションが嫌いです。ほとんどの場合、ディレクトリを削除したくないため、ディレクトリが空かどうかをテストしたいと考えています。以下はそれを行います。ただし、空のファイルをログに記録したいだけの場合は、おそらく無限のファイルをリストするよりも、削除して再作成する方が速いでしょうか?
これはうまくいくはずです...
if ! rmdir ${target}
then
echo "not empty"
else
echo "empty"
mkdir ${target}
fi