我想修改文件的日期文件为了使其比目录中存在的旧目录。时间差的值并不重要,因为目标只是为了让它变旧而变旧。
为了做到这一点,我需要touch file
使用比中存在的日期值更早的日期值目录。如何恢复最旧文件的日期值目录并从中减去一定的时间(例如1秒)?
答案1
find
您可以使用's-printf
或 with获取时间戳,stat
并对它们进行排序以获取最旧的时间戳。然后减去您想要的内容并将其用作 的日期规范touch
。find
其缺点是打印小数秒,在计算时必须将其删除。
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-epoch
GNU 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
需要一个三步解决方案:
提取最旧的时间戳(仅文件,而不是目录):
$ oldestfile=$(find path/to/dir/ -maxdepth 1 -type f -printf '%A@ %f\n' | sort -rn | head -n 1)
提取文件名(删除时间戳):
$ oldestfile="${oldestfile#* }"
touch (GNU) 文件到正确的时间:
$ touch -r "$oldestfile" -d '-1 min' "file"
这将生成一个名为file
(如果不存在)的文件,该文件比 .txt 中最旧的文件(不包括目录)早 1 分钟path/to/dir/
。