单个命令检查文件是否存在,并将(自定义)消息打印到标准输出?

单个命令检查文件是否存在,并将(自定义)消息打印到标准输出?

希望现在我已经遇到了它,请注意这一点:

我已经知道可以使用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

...但这仍然是两个命令 - 并且逻辑也是“相反的”(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

...不幸的是,我不能直接通过testand使用它$?

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

...我必须颠倒逻辑。

所以,我基本上必须想出一种自定义脚本解决方案(或者编写一个内联脚本作为单行)......我想,如果已经有一个可以打印 0 或 1 的默认命令(或者自定义消息)到标准输出以了解文件存在,那么我不必这样做:)

(请注意,这ls可能是一个候选者,但它的标准输出输出太冗长;如果我想避免这种情况,我必须抑制所有输出并再次返回存在状态,如

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

...但这又是两个命令(以及更多的输入),以及“反向”逻辑...)

那么,是否有一个默认命令可以在 Linux 中执行此操作?

答案1

使用这个单一的 bash 命令:

 [ -f /home/user/file_name ]

执行[]测试并在成功时返回 0

答案2

听起来你需要反转退出状态,所以你可以这样做:

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

或者:

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

(注意这-f是为了如果文件存在并且是一个常规文件。也可以看看这是我对相关 stackoverflow 问答的回答有关含义的更多题外话存在这里)。

答案3

怎么样“反转逻辑”:

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

答案4

这有效:

pwsh -c Test-Path /etc/passwd

...如果您安装了 PowerShell。如果路径存在,则返回字符串“True”;如果不存在,则返回“False”。 (这个答案我是否会得到“讽刺地无益”的分数?)

相关内容