【问题标题】:If file modification date is older than N days如果文件修改日期早于 N 天
【发布时间】:2021-12-19 07:19:38
【问题描述】:

如果文件的修改日期早于这么多天,则此问题与采取措施有关。我确信创建日期或访问日期会相似,但修改日期,如果我有:

file=path-name-to-some-file
N=100  # for example, N is number of days

我会怎么做:

if file modification time is older than N days
then
fi

【问题讨论】:

  • bash 本身并不提供您需要的工具——另外还需要操作系统提供的组件(如statfind)。请更新此问题以标记特定操作系统,以表明答案仅适用于 GNU 系统是可以接受的,或者表明您需要与所有 POSIX 平台兼容。

标签: bash


【解决方案1】:

有几种方法可用。一种是让find为你做过滤:

if [[ $(find "$filename" -mtime +100 -print) ]]; then
  echo "File $filename exists and is older than 100 days"
fi

另一个是使用 GNU date 来做数学:

# collect both times in seconds-since-the-epoch
hundred_days_ago=$(date -d 'now - 100 days' +%s)
file_time=$(date -r "$filename" +%s)

# ...and then just use integer math:
if (( file_time <= hundred_days_ago )); then
  echo "$filename is older than 100 days"
fi

如果你有 GNU stat,你可以要求一个文件的时间戳,以秒为单位,然后自己做一些数学运算(尽管这可能会在边界情况下有点偏离,因为它是在计算秒数——而不是考虑到闰日等——而不是四舍五入到一天的开始):

file_time=$(stat --format='%Y' "$filename")
current_time=$(( date +%s ))
if (( file_time < ( current_time - ( 60 * 60 * 24 * 100 ) ) )); then
  echo "$filename is older than 100 days"
fi

如果您需要支持非 GNU 平台,另一种选择是使用 Perl(我将留给其他人来演示)。

如果您对从文件中获取时间戳信息以及围绕这些信息的可移植性和稳健性限制更感兴趣,另请参阅 BashFAQ #87

【讨论】:

  • @MaheshKharvi,感谢您的更正,但请将编辑背后的推理保留在元数据文本中,或作为源中的隐藏注释(使用 &lt;!-- comment here --&gt; 语法);在帖子本身中以粗体大字显示可能被视为污损,这可能是最初的建议被拒绝的原因。
  • 我很困惑:shebang?
  • @flobee,shebang 是 UNIX 上脚本顶部的一行,描述了运行它的解释器。例如,#!/bin/bash 是一个 shebang,它指定脚本使用 bash 运行,而 #!/bin/sh 允许它使用任何 POSIX sh 解释器(可能不支持 bash 扩展)运行。
  • @flobee,...也就是说,我在答案中的任何地方都没有看到“shebang”这个词,所以我不太清楚混乱的来源。
  • 我问是因为有些片段在 bash 中不起作用,无论如何我在为我重新接线后现在得到了它,谢谢,shbang 和 bash 版本...... GNU bash 给出了一些提示...... :)
【解决方案2】:

我很惊讶没有人提到这个方法 - 它隐藏在 man test 中,由 -nt-ot 暗示,所以我怀疑它已经存在很长时间了:

N_DAYS_AGO=/tmp/n-days-ago.$$
touch -d "$N days ago" $N_DAYS_AGO
if [ "$myfile" -ot "$N_DAYS_AGO" ]; then
   ...
fi

【讨论】:

  • 不要惊讶。作者要求一种 bash 方式,但 touch 不是内置的。 touch 在 AIX 或 Solaris 上,Mac 可能没有-d 选项。我刚刚检查了 AIX。
【解决方案3】:

我找到了这个问题的另一个很好的答案。我们使用find-newerXY 选项。这是一个例子:

if [[ ! $(find "$file" -newermt "8 hours ago") ]]; then
    echo "File can't be older than 8 hours: $file"
    exit 1
fi

在这里找到它:https://superuser.com/a/1106706/1090383

【讨论】:

  • 谢谢,但还有其他解决方案吗?这仅适用于并非随处可用的 GNU find,例如在 AIX 上:find "$file" -newermt "8 hours ago" find: 0652-017 -newermt 不是有效选项。
  • statdate 在 AIX 上是否可用?在这种情况下,您可以使用另一个答案中描述的方法:stackoverflow.com/a/32019461/7391331
  • 统计:没有。 istat 不接受格式化参数。 date 在旧版本上不接受 +%s。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-04
  • 1970-01-01
相关资源
最近更新 更多