【问题标题】:date: extra operand '+%s'日期:额外的操作数 '+%s'
【发布时间】:2018-04-12 13:59:23
【问题描述】:

我遇到了一个小错误,虽然我的程序并没有崩溃,但它却让它陷入了困境。它一直给我错误:

date: extra operand '+%s'

当我计划删除数十万个日志文件时,这似乎真的影响了它可以处理的速度。这是有问题的程序:

#!/bin/bash
# Usage: ./s3DeleteByDate "bucketname" "2m"
aws s3 ls s3://$1 | grep " DIR " -v | while read -r line;
do
 createDate=$(echo "$line" | awk '{print $1" "$2}')
 createDate=`date -d "%Y-%m-%d %H:%M" "$createDate" +%s`
 olderThan=`date -d $2 +%s`
 if [[ $createDate -lt $olderThan ]]
  then
    fileName=`echo $line|awk {'print $4'}`
    if [[ $fileName != "" ]]
      then
        aws s3 rm  s3://$1"$fileName" --exclude "*" --include "*.tmp"
    fi
 fi
done;

【问题讨论】:

  • set -euo pipefail 添加到脚本的开头,这样您就可以对错误做出适当的反应。然后调查$createDate参数中的什么导致问题。
  • @Velkan set -e 并不总是一个好主意(例如,参见 here)。更好的是检查每个命令的预期结果
  • 我昨晚回答了这个问题:date +%s -d "$createDate"。您正在使用 GNU date,它不允许您为日期指定 输入 格式。
  • 我一定错过了。什么是替代方案?我认为 AWS 在 CRON 中。抱歉,我还在上 Linux 课程,但这是为了工作。
  • "$createDate" 是您想要格式化的日期吗?然后在它前面放一个-d

标签: linux bash ubuntu amazon-s3


【解决方案1】:

您在这一行中有两个格式说明符:

createDate=`date -d "%Y-%m-%d %H:%M" "$createDate" +%s`

大概您打算使用以下任一格式格式化$createDate

createDate=`date -d "$createDate" +"%Y-%m-%d %H:%M"`

或:

createDate=`date -d "$createDate" +%s`

我的钱在第二个,因为你后来在if 中使用了数字比较。

【讨论】:

  • 我都试过了,第一个它给了我:日期:额外的操作数“%Y-%m-%d %H:%M”。然后我尝试了第二种方法,它给了我日期:extra operand '%s'
  • 听起来你没有从命令中间删除额外的格式说明符。
【解决方案2】:

我将第 7 行更改为:date +%s -d "$createDate"。
这是有效的,因为它是一个 GNU 日期,它不允许您为日期指定输入格式。这修复了错误。

【讨论】:

  • Tom 的回答已经告诉你这样做了——它所有的例子在"$createDate" 之前都有一个-d。你为什么添加自己的而不是接受它?
  • 他的没用。唯一修复它的是将操作数从命令的后面移动到中间。
  • date 的哪个版本?使用 GNU 日期,date -d now +%s(后面有 %s)可以完美运行。与ideone.com/oem32p 的在线解释器相同。也就是说,我无法重现这种区别。
  • 'date -d "$createDate" +%s'。直到我把它放在“-d”前面,它才停止给我错误。
  • 给我一个我可以运行的命令,它可以独立运行,无需任何更改,我自己来查看问题(即一个完整的命令,应该工作但没有,因为模式在错误的位置)。据我所知,您在测试时的 createDate 值有误。
猜你喜欢
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
  • 1970-01-01
  • 2014-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多