重複の可能性:
ディレクトリにファイルが含まれているかどうかの確認
ディレクトリが空かどうかを確認したいので[
、次のように使用しています。
[ -f "./ini/*"]
ディレクトリが空でない場合でも、戻り値は常に 1 です。何が問題なのですか?
重複の可能性:
ディレクトリにファイルが含まれているかどうかの確認
ディレクトリが空かどうかを確認したいので[
、次のように使用しています。
[ -f "./ini/*"]
ディレクトリが空でない場合でも、戻り値は常に 1 です。何が問題なのですか?
これを試して:
$ 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
test
test コマンド (単語または)についても気にしないことに注意してください[..]
。
これがあなたにとって理にかなっていることを願っています。if
BASH シェルでは、コマンドと[...]
が 2 つの別個のコマンドであり、指定されたコマンドif
を実行し、実行するコマンドの終了コードに応じて動作するだけであることを理解するのが難しい場合があります。
「.」で始まるファイル名に注意してください。通常のグロビングまたは使用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
削除する必要があります。 .
..
if find ./ini/ -maxdepth 0 -empty | read;
then
echo "Not Empty"
else
echo "Empty"
fi
以下のコマンドの出力が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
これは私のために働く
[ "$(ls -A /path/to/directory)" ]
あなたの場合は
[ "$(ls -A ./ini/)" ]
あなたはそれを使用してそれをテストすることができます
[ "$(ls -A /tmp)" ] && echo "Not Empty" || echo "Empty"