回答:
このシンプルなBashワンライナーを使用します。
if [ -e FILENAME ] ; then echo Yes ; fi
-etrueにチェック評価される場合FILENAMEが存在するが、それはありません(ファイル、ディレクトリ、リンク、デバイス、...)であるかは重要。
通常のファイルのみをチェックする場合は、-f代わりに@Arronicalが言ったように使用します。
FILENAMEが変数展開の場合、または特殊文字を含む場合は、引用符を忘れないでください。たとえば、スクリプト内など[ -e "$1" ] && echo Yes。
[[と]]の代わりに、変数を引用。
[[ ]]、内部で展開を引用することは問題ではないことに注意してください。常に引用することは、[[ ]]演算子の内部または算術コンテキストの特別なルールを覚えていない初心者には良い習慣です。
次の簡単なスクリプトを使用できます。
#!/bin/bash
if [[ -f $1 ]]; then
echo "Yes"
exit 0
else
exit 1
fi
として保存しますfile-exists.sh。次に、ターミナルでを入力しchmod +x file-exists.shます。
次のように使用し./file-exists.sh FILEます:FILEチェックしたいファイルに置き換える場所、例えば:
./file-exists.sh file.txt
file.txt存在する場合Yes、ターミナルに出力され、プログラムはステータス0(成功)で終了します。ファイルが存在しない場合、何も出力されず、プログラムはステータス1(失敗)で終了します。
なぜ私がexitコマンドを含めたのか興味があるなら、読んでください...
exitコマンド?exit通常のプロセス終了を引き起こします。これが意味することは、基本的には、スクリプトを停止します。オプション(数値)パラメーターを受け入れます。このパラメーターは、呼び出し元のスクリプトの終了ステータスになります。
この終了ステータスは、他のスクリプトがスクリプトを使用できるfile-existsようにし、ファイルが存在するかどうかを知る方法です。
これを使用する簡単な例は、次のスクリプトです(名前を付けて保存file-exists-cli.sh)。
#!/bin/bash
echo "Enter a filename and I will tell you if it exists or not: "
read FILE
# Run `file-exists.sh` but discard any output because we don't need it in this example
./file-exists.sh $FILE &>> /dev/null
# #? is a special variable that holds the exit status of the previous command
if [[ $? == 0 ]]; then
echo "$FILE exists"
else
echo "$FILE does not exist"
fi
通常どおりchmod +x file-exists-cli.shに実行してから実行します./file-exists-cli.sh。次のようなものが表示されます。
ファイルが存在します(exit 0):
➜ ~ ./file-exists-cli.sh
Enter a filename and I will tell you if it exists or not:
booleans.py
booleans.py exists
ファイルが存在しません(exit 1):
➜ ~ ./file-exists-cli.sh
Enter a filename and I will tell you if it exists or not:
asdf
asdf does not exist
"$1"。空白が含まれていると、引用符なしで破損し、他の悪いことが起こる可能性があります。
コマンドラインのbashシェルで。
if [[ -f /path/to/file ]]; then echo "Yes"; fi
これは、bash条件演算子を使用し-f、ファイルが存在し、通常のファイルであるかどうかを確認しています。ディレクトリやリンクを含むファイルをテストする場合は、を使用します-e。
testそれが元の形式のファンではない、私はそれが過剰であることを知っていますが、それは私の習慣です。
[通常は組み込みコマンドを呼び出すコマンドを呼び出すのではありません)。これらは、単一ブレースバージョンの矛盾とダム動作を修正します。[ビルトインは互換性のために残りますが、新しいbashコードで使用する正当な理由は見当たりません。(古代のシェルなどで実行できるPOSIX準拠のスクリプトを作成する必要がある場合は異なります。)
[通常は組み込み関数を呼び出す」ことは疑わしいです。type -a [私にとっては、「シェル組み込み」、「/usr/bin/[。」
type結果は、私が言ったことを裏付けているように見えますよね?
あなたがしたいことをするための最も短いコマンドは次のとおりです:
test -e FILENAME && echo Yes
test -e指定された名前がファイルシステムに存在するかどうかをテストします。(test -f通常のファイルのみに制限するために使用できます。詳細man testを参照してください。)
指定された条件がtrueと評価された場合、test成功した終了ステータスを返します(そうでない場合は失敗ステータスを返します)。を使用して2つのコマンドを結合します&&。これは、「前のコマンドが成功ステータスで終了した場合に次のコマンドを実行する」ことを意味します。次のコマンドは、単にYes標準出力に出力します。対話型シェルの場合は、端末で。
これにより、ifステートメントの追加のテキスト資料が回避されますが、同じ結果が得られます。単一のコマンドのみが関係している場合、コマンドを結合するために&&(またはその反対の||)を使用するとうまく機能します。単一のコマンドの終了ステータスに応じて単一のコマンドを実行する以上のことを行う場合、if構文を使用するとすぐに読みやすくなります。
他の回答で既に指摘したように、同等のifスタイル構成は次のようになります。
if test -e FILENAME; then echo Yes; fi
または、代わりに:
if test -e FILENAME
then
echo Yes
fi
これらの目的のために、[およびtestが[必要]です。ただし、終了を要求します。
このタイプの質問の皮をむくには、複数の方法があります。また、別の方法があります:flagでfindコマンドを使用し-execます。ファイルへのパスfind /etcは、ディレクトリを設定し、-name FILENAMEファイル名を指定する2つの部分に分割できます(duh!)。ディレクトリのみで動作し-maxdepth続け、サブディレクトリに降りませんfind/etc
adminx@L455D:~$ find /etc -maxdepth 1 -name passwd -exec printf "YES\n" \;
YES
adminx@L455D:~$ find /etc -maxdepth 1 -name passwd1 -exec printf "YES\n" \;
adminx@L455D:~$
別の方法、経由stat:
adminx@L455D:~$ stat /etc/passwd1 &>/dev/null && echo YES
adminx@L455D:~$ stat /etc/passwd &>/dev/null && echo YES
YES
または、Python経由でも:
>>> import os
>>> if os.stat('/etc/passwd'):
... print 'YES'
...
YES
>>> if os.stat('/etc/passwd1'):
... print 'YES'
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 2] No such file or directory: '/etc/passwd1'
または、短いコマンドラインの代替:
python -c "from os.path import exists; print 'Yes' if exists('/etc/fstab') else '' "
[ -e FILENAME ] && echo Yes