Answers:
使用以下简单的Bash单行代码:
if [ -e FILENAME ] ; then echo Yes ; fi
无论-e
是否FILENAME
存在(文件,目录,链接,设备等),该检查的结果均为true 。
如果只想检查常规文件,请使用@Arronical所说的-f
代替。
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 shell中。
if [[ -f /path/to/file ]]; then echo "Yes"; fi
这将使用bash条件运算符-f
,并正在检查文件是否存在以及是否为常规文件。如果要测试任何文件,包括目录和链接,请使用-e
。
test
它的原始格式,我知道这太过分了,但这是我的习惯。
[
命令(通常调用内置命令)。)它们纠正了单个大括号版本的不一致和不正确的行为。[内置仍然是为了兼容性,但是我看不出有什么充分的理由在新的bash代码中使用它。(如果您需要编写可在古老的外壳或类似的东西上运行的POSIX兼容脚本,则有所不同。)
[
通常称为内置”是可疑的。type -a [
对我来说,列出“ shell内置”,然后列出“ /usr/bin/[
。”
type
结果似乎证实了我的意思,不是吗?
做您想做的最短的命令是:
test -e FILENAME && echo Yes
test -e
将测试给定名称在文件系统中是否存在。(您可以用来test -f
仅限制为常规文件。有关man test
更多信息,请参阅。)
如果给定的条件评估为true,则test
返回成功退出状态(否则返回失败状态)。我们使用组合这两个命令&&
,这意味着“如果前一个命令以成功状态退出,则执行下一个命令”。下一条命令只是Yes
在标准输出上打印;如果是交互式外壳,则在终端上。
这避免了if
语句的其他文本材料,但给出了相同的结果。当仅涉及单个命令时&&
,使用(或相反||
)将命令绑定在一起非常有效。如果您想要做的不仅仅是响应单个命令的退出状态而执行单个命令,那么使用该if
语法将变得更加易读。
正如其他答案中已经指出的那样,等效的if
样式构造应为:
if test -e FILENAME; then echo Yes; fi
或者:
if test -e FILENAME
then
echo Yes
fi
为了这些目的,[
并test
是等效的,所不同的是[
要求的终接]
。
要解决此类问题,可以采用多种方法,这是另一种方法:使用find
带-exec
flag的命令。文件的路径可以分为两部分find /etc
,分别设置目录和-name FILENAME
指定文件名(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