检查文件存在于tar之前

时间:2018-04-03 12:52:06

标签: bash unix sh

我想根据文件名中的日期来tar文件,但是如果文件不存在,tar会创建一个空的tar文件

我有anychar_20180322_anychar的文件

anychar_20180322_anychar.txt
anychar_20180322_anychar.txt
anychar_20180322_anychar.txt
anychar_20180322_anychar.txt

我想tar那些文件,但在此之前我想检查目录中是否存在文件。

示例 - 在以下示例中,没有20180319的文件。但你可以在其中看到一个tar文件。

tar: /tmp/dir/*20180319*: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous erro

RS

   -rw------- 1 user group 16M Apr  3 05:31 20180322.tar.gz
  -rw------- 1 user group  45 Apr  3 05:31 20180319.tar.gz

以下代码:

d=$(date -d"10 days ago" +%s)
    dt="$(date -d@$((d - i * 86400)) +%Y%m%d)"
    if [ "$dt" -lt "$d" ] && [ test -f "*$dt*" ]; then
    tar czf $fn *$dt*
    fi 
    done

如何检查特定日期中存在的至少一个文件并继续执行tar,否则进入另一个日期。

3 个答案:

答案 0 :(得分:0)

在shell脚本中执行操作之前,我使用以下代码检查文件是否存在:

# Test file
if [ -f /path/to/file/$FILENAME ]; then
  # do something
else
  echo "file not found"
fi

答案 1 :(得分:0)

if [ "$dt" -lt "$d" ] && [ test -f "*$dt*" ]...

test[]但不是两个 用于扩展,没有双引号宽度
它应该更好:

if [ "$dt" -lt "$d" ] && [ -f *"$dt"* ]; then
...

答案 2 :(得分:0)

您可以使用:

d=$(date -d"10 days ago" +%s)
dt="$(date -d@$((d - i * 86400)) +%Y%m%d)"
if [ "$dt" -lt "$d" ]; then
     for f in *"$dt"*; do # Iterate through everything the glob expands to
         if ! [ -f "$f" ]; then # check whether it exists - if glob finds nothing, the glob itself is returned
            exist=0
         else
            exist=1
         fi
         break # Don't waste time looping through everything...
     done
     if [ $exist -ne 0 ]; then
         tar czf "$fn" *"$dt"*
     fi
fi 

(你的样本是一个额外的循环内部,有一些复制粘贴错误......)