如何在shell脚本中检查文件是否存在

xoefb8l8  于 2023-05-01  发布在  Shell
关注(0)|答案(7)|浏览(122)

我想写一个shell脚本,它检查某个文件archived_sensor_data.json是否存在,如果存在,就删除它。在http://www.cyberciti.biz/tips/find-out-if-file-exists-with-conditional-expressions.html之后,我尝试了以下操作:

[-e archived_sensor_data.json] && rm archived_sensor_data.json

但是,这会引发错误

[-e: command not found

当我尝试使用./test_controller命令运行生成的test_controller脚本时。代码有什么问题?

kmpatx3s

kmpatx3s1#

括号和-e之间缺少必需的空格:

#!/bin/bash
if [ -e x.txt ]
then
    echo "ok"
else
    echo "nok"
fi
jjhzyzn0

jjhzyzn02#

以下是使用ls的替代方法:

(ls x.txt && echo yes) || echo no

如果你想隐藏ls的任何输出,以便只看到yes或no,请将stdoutstderr重定向到/dev/null

(ls x.txt >> /dev/null 2>&1 && echo yes) || echo no
hec6srdp

hec6srdp3#

我的解决方案建议的背景是一个朋友的故事,他在第一份工作的第二周就清理了一半的构建服务器。所以基本的任务是找出一个文件是否存在,如果存在,让我们删除它。但这条河上有几处险要的急流

  • 一切都是一个文件。
  • 脚本只有在解决一般任务时才有真实的的威力
  • 一般来说,我们使用变量
  • 我们经常在脚本中使用-f force来避免人工干预
  • 而且还喜欢-r递归,以确保我们及时地创建、复制和销毁。

请考虑以下场景:
我们有要删除的文件:文件存在。json
此文件名存储在变量中

<host>:~/Documents/thisfolderexists filevariable="filesexists.json"

我们也有一个路径变量,使事情真正灵活

<host>:~/Documents/thisfolderexists pathtofile=".."

<host>:~/Documents/thisfolderexists ls $pathtofile

filesexists.json  history20170728  SE-Data-API.pem  thisfolderexists

让我们看看-e是否做了它应该做的事情。文件是否存在?

<host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?

0

是的。魔法。
但是,如果文件变量不小心被求值为nuffin,会发生什么呢

<host>:~/Documents/thisfolderexists filevariable=""

<host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?

0

什么?它应该返回一个错误。这就是整个文件夹被意外删除的故事的开始
另一种方法是专门测试我们所理解的“文件”

<host>:~/Documents/thisfolderexists filevariable="filesexists.json"

<host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?

0

所以文件存在。..

<host>:~/Documents/thisfolderexists filevariable=""

<host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?

1

所以这不是一个文件,也许,我们不想删除整个目录
man test有以下说法:

-b FILE

       FILE exists and is block special

-c FILE

       FILE exists and is character special

-d FILE

       FILE exists and is a directory

-e FILE

       FILE exists

-f FILE

       FILE exists and is a regular file

...

-h FILE

       FILE exists and is a symbolic link (same as -L)
xkftehaa

xkftehaa4#

在内部,rm命令必须测试文件是否存在
那为什么还要增加一项测试呢刚发行

rm filename

在那之后它就会消失不管它是否存在。
使用rm-f是你不想任何关于不存在的文件的消息。
如果您需要在文件不存在的情况下采取一些措施,那么您必须自己进行测试。根据您的示例代码,本示例中并非如此。

o4hqfura

o4hqfura5#

如果您使用的是NFS,“test”是一个更好的解决方案,因为您可以在NFS关闭时添加超时:

time timeout 3 test -f 
/nfs/my_nfs_is_currently_down
real    0m3.004s <<== timeout is taken into account
user    0m0.001s
sys     0m0.004s
echo $?
124   <= 124 means the timeout has been reached

“[ -e my_file ]”构造将冻结,直到NFS再次正常工作:

if [ -e /nfs/my_nfs_is_currently_down ]; then echo "ok" else echo "ko" ; fi

<no answer from the system, my session is "frozen">
2w3kk1z5

2w3kk1z56#

也可以使用stat

stat /
  File: /
  Size: 4096            Blocks: 8          IO Block: 4096   directory
Device: fd01h/64769d    Inode: 2           Links: 26
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2009-01-01 02:00:00.000000000 +0200
Modify: 2009-01-01 02:00:00.000000000 +0200
Change: 2009-01-01 02:00:00.000000000 +0200
 Birth: -

在一条不存在的路径上,你会得到:

stat /aaa
stat: cannot stat '/aaa': No such file or directory
xkftehaa

xkftehaa7#

read -p "enter filename:"filename
If [ -e $filename ]
Then
     echo "file exist"
else
     echo "file doesn't exist"

相关问题