【问题标题】:Test a file date with bash使用 bash 测试文件日期
【发布时间】:2023-03-14 11:50:02
【问题描述】:

我正在尝试在if 语句中测试使用 bash 创建文件的时间(以秒为单位)。我需要创建日期,而不是修改。

您知道如何在不使用findgrep 之类的命令的情况下执行此操作吗?

【问题讨论】:

  • 您可以使用许多命令来执行此操作,而 bash 可以调用所有这些命令。为什么厌恶使用外部命令? UNIX 建立在工具只做一件事和做好一件事的理念之上。
  • 最后修改时间是否足够 - 或者您需要创建时间?
  • 创建日期不存储在许多常用文件系统中。你用什么文件系统?
  • 问题还在于使用在 VFS 之上运行的标准工具获取时间,无论是否存储时间戳。 +1 关于创建时间戳的唯一有效答案...
  • Ext2FS / ReiserFS (Linux/Debian)

标签: bash file datetime creation


【解决方案1】:

恐怕我无法回答创建时间的问题,但是对于上次修改时间,您可以使用以下方法获取纪元日期,以为单位,因为文件名最后修改的

date --utc --reference=filename +%s

所以你可以这样:

modsecs=$(date --utc --reference=filename +%s)
nowsecs=$(date +%s)
delta=$(($nowsecs-$modsecs))
echo "File $filename was modified $delta secs ago"

if [ $delta -lt 120 ]; then
  # do something
fi

等等。

更新 一种更优雅的方式(同样,仅修改时间):how do I check in bash whether a file was created more than x time ago?

【讨论】:

    【解决方案2】:

    这里是我暂时找到的最好的答案,不过只是修改时间:

    expr `date +%s` - `stat -c %Y /home/user/my_file`
    

    【讨论】:

    • 用 %Z 而不是 %Y 你得到最后的更改日期(创建日期在我的机器上)
    【解决方案3】:

    如果你的系统有stat:

    modsecs=$(stat --format '%Y' filename)
    

    您可以按照 Joel 的回答进行计算。

    【讨论】:

      【解决方案4】:

      您可以将 ls 与 --full-time 一起使用

      file1="file1"
      file2="file2"
      declare -a array
      i=0
      ls -go --full-time "$file1" "$file2" | { while read -r  a b c d time f
      do    
        time=${time%.*}  
        IFS=":"
        set -- $time
        hr=$1;min=$2;sec=$3
        hr=$(( hr * 3600 ))
        min=$(( min * 60 ))  
        totalsecs=$(( hr+min+sec ))
        array[$i]=$totalsecs  
        i=$((i+1))
        unset IFS      
      done
      echo $(( ${array[0]}-${array[1]} ))
      }  
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-21
        • 2013-01-26
        • 1970-01-01
        • 2010-12-28
        • 2019-08-20
        • 2017-07-29
        • 2018-01-11
        • 1970-01-01
        相关资源
        最近更新 更多