修改文件的日期,使其早于特定文件夹中的任何其他文件

修改文件的日期,使其早于特定文件夹中的任何其他文件

我想修改文件的日期文件为了使其比目录中存在的旧目录。时间差的值并不重要,因为目标只是为了让它变旧而变旧。

为了做到这一点,我需要touch file使用比中存在的日期值更早的日期值目录。如何恢复最旧文件的日期值目录并从中减去一定的时间(例如1秒)?

答案1

find您可以使用's-printf或 with获取时间戳,stat并对它们进行排序以获取最旧的时间戳。然后减去您想要的内容并将其用作 的日期规范touchfind其缺点是打印小数秒,在计算时必须将其删除。

oldest=$(stat -c "%Y" dir/*|sort|head -1)
touch -d "@$((oldest-1))" dir/file
# or touch -d "@$((oldest-60))" file # subtract 1 min to see the difference in normal ls -l output.

-d @seconds-since-epochGNU touch 支持日期语法。 POSIX 没有指定它。

stat命令不是由 POSIX 指定的,它是 GNU coreutils 的一部分,请参阅https://stackoverflow.com/questions/27828585/posix-analog-of-coreutils-stat-command

所以这个解决方案应该适用于Linux系统,但可能不适用于一般的UNIX系统。

答案2

您可以通过两步过程来完成此操作:复制时间戳,然后将其调整为较旧的时间戳:

#find the eldest file in dir
eldest=$(ls -t dir | tail -1)

#duplicate the time
touch -r "dir/$eldest" myfile

#make the file one second older
touch -A -000001 myfile

答案3

可移植的是,您必须用来perl收集时间戳,减去您想要的时间,然后将其格式化为touch.

t=$(perl make-oldest 1 dir/*)
if [ "$t" -gt 0 ]
then
  touch -t "$t" file
else
  echo "Sorry, unable to find a file!"
fi

...最古老的 Perl 脚本是:

#!/usr/bin/perl -w
use strict;
use POSIX qw(strftime);

my $subtract = shift;
my $oldest = 0;
for (@ARGV) {
  my @s = stat;
  next unless @s;
  if ($oldest) {
    $oldest = $s[9] if $s[9] < $oldest;
  } else {
    $oldest = $s[9];
  }
}

if ($oldest) {
  # convert ($oldest - $subtract) into CCCCYYMMDDhhmm.SS
  print strftime "%Y%m%d%H%M.%S\n", localtime($oldest - $subtract);
} else {
  print "0\n";
}

目的是您的 shell 扩展通配符dir/*以获取文件名列表。 Perl 脚本有“两个”参数:从最旧的文件中减去的秒数,以及从中收集时间戳的文件列表。

Perl 脚本提取减法参数,然后循环给定的文件并跟踪最旧的修改时间。如果它无法读取任何文件,那么它将返回零(如上面的包装脚本所测试)。如果一个找到最旧的文件,然后我们使用该strftime函数将减去的时间戳转换为适当的格式touch

答案4

需要一个三步解决方案:

  1. 提取最旧的时间戳(仅文件,而不是目录):

    $ oldestfile=$(find path/to/dir/ -maxdepth 1 -type f -printf '%A@ %f\n' | sort -rn | head -n 1)
    
  2. 提取文件名(删除时间戳):

    $ oldestfile="${oldestfile#* }"
    
  3. touch (GNU) 文件到正确的时间:

    $ touch -r "$oldestfile" -d '-1 min' "file"
    

这将生成一个名为file(如果不存在)的文件,该文件比 .txt 中最旧的文件(不包括目录)早 1 分钟path/to/dir/

相关内容