首页 文章

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

提问于
浏览
101

我想编写一个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 脚本时 . 代码有什么问题?

4 回答

  • 227

    您在支架和 -e 之间缺少必要的空格:

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

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

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

    如果你想隐藏 ls 的任何输出,所以你只看到是或否,将 stdoutstderr 重定向到 /dev/null

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

    在内部,rm命令必须测试文件是否存在,
    为什么要添加另一个测试?只是问题

    rm filename
    

    它会在那之后消失,无论它是否存在 .
    使用rm -f是您不希望有关于不存在的文件的任何消息 .

    如果您不需要执行某些操作,那么您必须自己测试 . 根据您的示例代码,在这种情况下不是这种情况 .

  • 14

    我的解决方案建议的背景是一个朋友的故事,他在第一份工作的第二周,擦拭了半个构建服务器清理 . 所以基本的任务是弄清楚文件是否存在,如果存在,让我们删除它 . 但是这条河上有一些危险的急流:

    • 一切都是文件 .

    • 脚本只有在解决一般任务时才有真正的力量

    • 一般来说,我们使用变量

    • 我们经常在脚本中使用-f force来避免手动干预

    • 并且还爱 - 递归以确保我们及时创建,复制和销毁 .

    请考虑以下情形:

    我们有要删除的文件:filesexists.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)
    

相关问题