V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jeblur
V2EX  ›  Bash

请教下如何检测文件是否存在

  •  
  •   jeblur · 2020-06-08 14:43:22 +08:00 · 3702 次点击
    这是一个创建于 1647 天前的主题,其中的信息可能已经有所发展或是发生改变。

    写了一个非常简单的脚本用于筛选日志并且归档,但是不知道如何写条件来保证输入的日期所对应的日志文件是否存在,比如 5 月份如果并没有日志产生,那希望程序提示并退出

    #!/bin/bash
    
    syslog_path="/var/log/dcmc_syslog_devices"
    
    read -p "Enter IP to clear the desired directory: " ip_syslog_path
    read -p "Enter desired date to clear[YYYY-MM]: " desired_date
    
    desired_path="/var/log/dcmc_syslog_devices/${ip_syslog_path}"
    
    
    if [ ! -d ${desired_path} ]; then
    	echo "Log directory does not exist! Script exited."
    	exit 1
    fi
    
    if [ ! -f ${"/var/log/dcmc_syslog_devices/${ip_syslog_path}/${ip_syslog_path}-${desired_date}*.log"}]; then
    	echo "Desired log is not available! Script exited."
    	exit 1
    fi
    
    #Packing syslog
    echo $(date +"%Y-%m-%d %H:%M:%S")
    echo "Start packing syslogs..."
    sudo tar -zcvf ${desired_path}/${ip_syslog_path}-${desired_date}.tar.gz ${desired_path}/${ip_syslog_path}-${desired_date}*.log
    

    由于日志文件最后是包含日期的所以一直使用"*"来覆盖后面的日,现在也不知道怎么修改,但是问题应该在于我的第二个条件中的这种写法是不被支持的,有没有大佬来说下这个该怎么调整啊,感谢!

    第 1 条附言  ·  2020-06-08 16:04:18 +08:00
    问题最后在 stackoverflow 找到了相关问题和解决方法,链接如下
    https://stackoverflow.com/questions/6363441/check-if-a-file-exists-with-wildcard-in-shell-script/6397979#6397979
    如有朋友有相关问题可以查下上述链接
    更改的代码如下
    ```
    #!/bin/bash

    syslog_path="/var/log/dcmc_syslog_devices"

    read -p "Enter IP to clear the desired directory: " ip_syslog_path
    read -p "Enter desired date to clear[YYYY-MM]: " desired_date

    desired_path="/var/log/dcmc_syslog_devices/${ip_syslog_path}"

    if [ ! -d ${desired_path} ]; then
    echo "Log directory does not exist! Script exited."
    exit 1
    fi

    for f in ${desired_path}/${ip_syslog_path}-${desired_date}*.log; do
    if [[ -f "$f" ]]; then
    echo $(date +"%Y-%m-%d %H:%M:%S")
    echo "Start packing syslogs..."
    sudo tar -zcvf ${desired_path}/${ip_syslog_path}-${desired_date}.tar.gz ${desired_path}/${ip_syslog_path}-${desired_date}*.log
    sudo rm ${desired_path}/${ip_syslog_path}-${desired_date}*.log
    break
    else
    echo "Files do not exist!"
    fi
    done



    ```
    2 条回复    2020-06-08 16:03:07 +08:00
    jason1121
        1
    jason1121  
       2020-06-08 15:12:08 +08:00
    文件名中干嘛要有星号呢,处理起来不会麻烦么;
    这一串 ${"/var/log/dcmc_syslog_devices/${ip_syslog_path}/${ip_syslog_path}-${desired_date}*.log"} 干嘛要用{}括起来,他又不是一个变量,直接 [ ! -f /path/to/file ] 就够了;
    而且 ] 前和[ 后是要有一个空格的,你]前也漏了空格
    jeblur
        2
    jeblur  
    OP
       2020-06-08 16:03:07 +08:00
    @jason1121 感谢回复,上述这串代码其实是从网上找的,只想看看能否有用
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2716 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 14:34 · PVG 22:34 · LAX 06:34 · JFK 09:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.