134

シェルスクリプトから、ディレクトリにファイルが含まれているかどうかを確認するにはどうすればよいですか?

これに似たもの

if [ -e /some/dir/* ]; then echo "huzzah"; fi;

ただし、ディレクトリに1つまたは複数のファイルが含まれている場合は機能します(上記のファイルは正確に0または1つのファイルでのみ機能します)。

4

29 に答える 29

85

これまでのソリューションではls. すべてのbashソリューションは次のとおりです。

#!/bin/bash
shopt -s nullglob dotglob     # To include hidden files
files=(/some/dir/*)
if [ ${#files[@]} -gt 0 ]; then echo "huzzah"; fi
于 2008-09-18T10:46:21.353 に答える
51

以下はどうでしょう。

if find /some/dir/ -maxdepth 0 -empty | read v; then echo "Empty dir"; fi

この方法では、ディレクトリの内容の完全なリストを生成する必要はありません。はread、出力を破棄し、何かが読み取られた場合 (つまり/some/dir/、 によって空が検出された場合) にのみ式を真に評価するようにしますfind

于 2008-09-18T11:05:35.957 に答える
23

試す:

if [ ! -z `ls /some/dir/*` ]; then echo "huzzah"; fi
于 2008-09-18T10:09:04.470 に答える
16

たくさんのファイルがあるディレクトリには注意してください! コマンドの評価には時間がかかる場合がありlsます。

IMO 最良の解決策は、

find /some/dir/ -maxdepth 0 -empty
于 2008-09-18T11:31:03.557 に答える
15
# 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
}
于 2011-01-24T03:05:58.523 に答える
8
DIR="/some/dir"
if [ "$(ls -A $DIR)" ]; then
     echo 'There is something alive in here'
fi
于 2008-09-18T10:10:35.917 に答える
6

これの出力を比較していただけますか?

 ls -A /some/dir | wc -l
于 2008-09-18T10:12:31.983 に答える
4

これは本当に遅い応答かもしれませんが、ここにうまくいく解決策があります。この行は、ファイルの存在のみを認識します。ディレクトリが存在する場合、誤検知は発生しません。

if find /path/to/check/* -maxdepth 0 -type f | read
  then echo "Files Exist"
fi
于 2009-01-04T00:52:21.053 に答える
4
# ディレクトリに非表示でないファイルが含まれているかどうかを確認します。
#
# 使い方: if isempty "$HOME"; 次に、「お帰りなさい」とエコーします。フィ
#
isempty() {
    $1/* の _ief の場合。行う
        if [ -e "$_ief" ]; それから
            リターン 1
        フィ
    終わり
    0 を返す
}

いくつかの実装上の注意:

  • forループは、外部lsプロセスへの呼び出しを回避します。それでも、すべてのディレクトリ エントリを 1 回読み取ります。これは、readdir() を明示的に使用する C プログラムを作成することによってのみ最適化できます。
  • ループのtest -e内側は、空のディレクトリのケースをキャッチします。その場合、変数_iefには値「somedir/*」が割り当てられます。そのファイルが存在する場合にのみ、関数は「空でない」を返します
  • この関数は、すべての POSIX 実装で機能します。ただし、Solaris の /bin/sh はそのカテゴリに分類されないことに注意してください。その実装はフラグtestをサポートしていません。-e
于 2010-03-08T17:04:28.510 に答える
4

これにより、ディレクトリが空かどうか、そうでない場合は含まれているファイルの数がわかります。

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
于 2015-04-24T07:34:27.340 に答える
1

ブルーノの答えの小さなバリエーション:

files=$(ls -1 /some/dir| wc -l)
if [ $files -gt 0 ] 
then
    echo "Contains files"
else
    echo "Empty"
fi

わたしにはできる

于 2015-09-16T08:43:18.287 に答える
1

空のディレクトリに関する 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 のようなエラー メッセージを回避するために、明示的な空のディレクトリ テストが必要であると考えた可能性がありますが、実際にはそのようなテストは必要ありません。

于 2014-08-01T17:00:22.767 に答える
0

bashでの簡単な答え:

if [[ $(ls /some/dir/) ]]; then echo "huzzah"; fi;
于 2016-04-28T00:56:30.587 に答える
0

プルーンのものと最後の答えを混ぜ合わせて、私は

find "$some_dir" -prune -empty -type d | read && echo empty || echo "not empty"

スペースを含むパスでも機能します

于 2016-03-16T16:26:39.743 に答える
-1
if ls /some/dir/* >/dev/null 2>&1 ; then echo "huzzah"; fi;
于 2008-09-18T10:14:53.520 に答える
-1

特定のターゲット ディレクトリをテストするには

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;
于 2013-04-30T19:25:32.853 に答える
-2

ls - A投稿されたソリューションが嫌いです。ほとんどの場合、ディレクトリを削除したくないため、ディレクトリが空かどうかをテストしたいと考えています。以下はそれを行います。ただし、空のファイルをログに記録したいだけの場合は、おそらく無限のファイルをリストするよりも、削除して再作成する方が速いでしょうか?

これはうまくいくはずです...

if !  rmdir ${target}
then
    echo "not empty"
else
    echo "empty"
    mkdir ${target}
fi
于 2012-01-21T16:59:58.210 に答える