特定のファイルが存在する場合に任意のメッセージを表示するコマンド


11

特定のファイルが存在する場合に「はい」というメッセージを表示するコマンドはありますか?ファイルが存在しない場合、機能を提供する必要はありません。

回答:


25

このシンプルなBashワンライナーを使用します。

if [ -e FILENAME ] ; then echo Yes ; fi

-etrueにチェック評価される場合FILENAMEが存在するが、それはありません(ファイル、ディレクトリ、リンク、デバイス、...)であるかは重要。

通常のファイルのみをチェックする場合は、-f代わりに@Arronicalが言ったように使用します。


18
[ -e FILENAME ] && echo Yes
ゼブマッコークル

@ZebMcCorkle正しい、それも動作します。別の回答として投稿することもできます。
バイトコマンダー

3
FILENAMEが変数展開の場合、または特殊文字を含む場合は、引用符を忘れないでください。たとえば、スクリプト内など[ -e "$1" ] && echo Yes
ピーターコーデス

@PeterCordesあなたが使用できるのbashを使用している場合[[]]の代わりに、変数を引用。
ホロウェイ

1
@Holloway:うん、でも時にはPOSIX shだけを必要とする移植可能なスクリプトを書く必要がある。そのため、私はこれをダウンボットし、bashの答えをアップボットする代わりに、この安全なバージョンを提供しました。また[[ ]]、内部で展開を引用することは問題ではないことに注意してください。常に引用することは、[[ ]]演算子の内部または算術コンテキストの特別なルールを覚えていない初心者には良い習慣です。
ピーターコーデス

10

次の簡単なスクリプトを使用できます。

#!/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

2
良いですが、のような変数参照を引用してください"$1"。空白が含まれていると、引用符なしで破損し、他の悪いことが起こる可能性があります。
ジョー

9

コマンドラインのbashシェルで。

if [[ -f /path/to/file ]]; then echo "Yes"; fi

これは、bash条件演算子を使用し-f、ファイルが存在し、通常のファイルであるかどうかを確認しています。ディレクトリやリンクを含むファイルをテストする場合は、を使用します-e

これは、bash条件の優れたリソースです。


1
なぜ二重中括弧ですか?
バイトコマンダー

1
私はtestそれが元の形式のファンではない、私はそれが過剰であることを知っていますが、それは私の習慣です。

7
@ByteCommander:ダブルブレースは、シングルブレースよりも一般的に優れています。それらはシェル構文の一部です([通常は組み込みコマンドを呼び出すコマンドを呼び出すのではありません)。これらは、単一ブレースバージョンの矛盾とダム動作を修正します。[ビルトインは互換性のために残りますが、新しいbashコードで使用する正当な理由は見当たりません。(古代のシェルなどで実行できるPOSIX準拠のスクリプトを作成する必要がある場合は異なります。)
ニックマッテオ

@kundor:ほとんどの場合、公平であることに同意しますが、「[通常は組み込み関数を呼び出す」ことは疑わしいです。type -a [私にとっては、「シェル組み込み」、「/usr/bin/[。」
wchargin

1
@wchargin:私はあなたが何を得ているのか理解できないのではないかと心配しています。あなたのtype結果は、私が言ったことを裏付けているように見えますよね?
ニックマッテオ

5

あなたがしたいことをするための最も短いコマンドは次のとおりです:

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[必要]です。ただし、終了を要求します。


4

このタイプの質問の皮をむくには、複数の方法があります。また、別の方法があります: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 '' "
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.