3

重複の可能性:
ディレクトリにファイルが含まれているかどうかの確認

ディレクトリが空かどうかを確認したいので[、次のように使用しています。

[ -f "./ini/*"]

ディレクトリが空でない場合でも、戻り値は常に 1 です。何が問題なのですか?

4

5 に答える 5

4

これを試して:

$ echo "*"   #With quotes

対。

$ echo *    #No quotes

違いを見ます?文字列を引用符で囲むと、シェルはアスタリスクを一致するファイルに置き換えるためにグロブできません。

欲しいものを手に入れる方法はたくさんあります。ls最も簡単なのは、test コマンドなしでコマンドを使用することです。このifステートメントは、指定したコマンドの出力結果を取得します。は単にコマンド[...]のエイリアスです。test次の 2 つのステートメントは同等です。

$ if test -f foo.txt

$ if [ -f foo.txt ]

基本的に、すべてのテスト コマンドは0、テストが true の場合は a を返し、テストが false の場合はゼロ以外を返します。ifコマンドが実行するのは、指定されたコマンドが終了コードifを返す場合にステートメントを実行することだけです。0ここまで説明する理由は、テストのことは忘れて、単にlsコマンドを使用しようということです。

foo.txtファイルはあるがファイルがないと仮定しますbar.txt。次のことを試してください。

$ ls foo.txt > /dev/null 2>&1
$ echo $?
0
$ ls bar.txt > /dev/null 2>&1
$ echo $?
2

> /dev/null 2>&1、すべての出力を禁止するために使用されます。lsファイルが存在する場合のコマンド0の終了コードは であるのに対し、ファイルlsが存在しない場合のコマンドの終了コードは notであることに注意してください0。(2この場合です)。それでは、test コマンドの代わりにそれを使用しましょう。

if ls ./ini/* > /dev/null 2>&1
then
    echo "There are files in that directory!"
else
    echo "There are no files in that directory"
fi

testtest コマンド (単語または)についても気にしないことに注意してください[..]

これがあなたにとって理にかなっていることを願っています。ifBASH シェルでは、コマンドと[...]が 2 つの別個のコマンドであり、指定されたコマンドifを実行し、実行するコマンドの終了コードに応じて動作するだけであることを理解するのが難しい場合があります。

于 2012-09-11T13:15:31.077 に答える
2

「.」で始まるファイル名に注意してください。通常のグロビングまたは使用ls( shudder ) では検出されません。これを行うにはいくつかの方法があります。

/home/user1> mkdir ini
/home/user1> cd ini
/home/user1/ini> touch .fred jim tom dick harry
/home/user1/ini> cd ..
/home/user1> declare -a names
/home/user1> names=(./ini/* ./ini/.*)
/home/user1> number_of_files=$(( ${#names[@]} -2 ))
/home/user1> echo $number_of_files
5

をリストから-2削除する必要があります。 ...

于 2012-09-11T09:23:58.407 に答える
0
if find ./ini/ -maxdepth 0 -empty | read;
then
echo "Not Empty"
else
echo "Empty"
fi
于 2012-09-11T12:44:09.267 に答える
0

以下のコマンドの出力が0ディレクトリにファイルがない場合 (ディレクトリが空)、それ以外の場合はファイルがあります!

$find "/path/to/check" -type f -exec echo {} \;|wc -l

だからあなたのために -

exist=`find "./ini" -type f -exec echo {} \;|wc -l`
if [ $exist -gt 0 ]
then
   echo "Directory has files"
else
   echo "Directory is empty"
fi

または

if [ `find "./ini" -type f -exec echo {} \;|wc -l` -gt 0 ]
then
   echo "Directory has files"
else
   echo "Directory is empty"
fi
于 2012-09-11T14:29:51.310 に答える
-2

これは私のために働く

[ "$(ls -A /path/to/directory)" ]

あなたの場合は

[ "$(ls -A ./ini/)" ]

あなたはそれを使用してそれをテストすることができます

[ "$(ls -A /tmp)" ] && echo "Not Empty" || echo "Empty"
于 2012-09-11T06:06:18.653 に答える