web-dev-qa-db-ja.com

ファイルが存在するかどうかを確認し、(カスタム)メッセージを標準出力に出力する単一のコマンド?

私がそれに遭遇した今、これに注意するのがOKであることを願っています:

test(_[_)コマンドを使用してファイルの存在をテストできることはすでに知っています。

_$ touch exists.file
$ if [ -f exists.file ] ; then echo "yes" ; else echo "no" ; fi
yes
$ if [ -f noexists.file ] ; then echo "yes" ; else echo "no" ; fi
no
_

...しかし、そこに少し入力する必要があります_:)_したがって、「デフォルト」の単一のコマンドがあると、ファイルの存在の結果をstdoutに返すかどうか迷っていました。

testを終了ステータス_$?_で使用することもできます:

_$ test -f exists.file ; echo $?
0
$ test -f noexists.file ; echo $?
1
_

...しかし、これはまだ2つのコマンドです-ロジックも「逆」です(成功の場合は0、失敗の場合はゼロ以外)。

私が尋ねている理由は、gnuplot内のファイルの存在をテストする必要があるためです。その "system("command")は、stdoutから結果の文字ストリームを文字列として返します。 "; gnuplotで直接行うことができます:

_gnuplot> if (0) { print "yes" } else { print "no" }
no
gnuplot> if (1) { print "yes" } else { print "no" }
yes
_

だから私は基本的にこのようなもの(疑似)を書くことができるようにしたいと思います:

_gnuplot> file_exists = system("check_file --stdout exists.file")
gnuplot> if (file_exists)  { print "yes" } else { print "no" }
yes
_

...残念ながら、testおよび_$?_を介して直接使用することはできません。

_gnuplot> file_exists = system("test -f exists.file; echo $?")
gnuplot> if (file_exists)  { print "yes" } else { print "no" }
no
_

...論理を逆にしなければならない。

したがって、基本的にはカスタムスクリプトソリューション(またはスクリプトをインラインで1行で記述する)を考え出す必要があります...そして、0または1を出力できるデフォルトのコマンドがすでにある場合(またはカスタムメッセージ)ファイルの存在をstdoutに送信する場合、その必要はありません_:)_

lsは候補である可能性がありますが、標準出力は非常に詳細すぎることに注意してください。それを回避したい場合は、次のようにすべての出力を抑制し、再度存在ステータスを返す必要があります。

_$ ls exists.file 1>/dev/null 2>/dev/null ; echo $? 
0
$ ls noexists.file 1>/dev/null 2>/dev/null ; echo $? 
2
_

...しかし、これも2つのコマンド(およびより多くのタイピング)と「反転」ロジックです...)

では、Linuxでこれを実行できる単一のデフォルトコマンドはありますか?

18
sdaau

終了ステータスを逆にする必要があるように聞こえるので、次のことができます:

system("[ ! -e file ]; echo $?")

または:

system("[ -e file ]; echo $((!$?))")

(ご了承ください -fファイルが存在する場合および通常のファイル)の場合です。

9

次の単一のbashコマンドを使用します。

 [ -f /home/user/file_name ]

[]テストを実行し、成功すると0を返します

5
YaronE

「ロジックの反転」についてはどうでしょうか。

file_exists = 1-system("test -f exists.file; echo $?")
1
user33734