文件按时间排序问题

文件按时间排序问题

我需要识别一组文件中的序列间隙。序列从 FILENAME_0001 开始,到 FILENAME_9999 结束。此后序列从 0001 重新开始。

为了实现正确的序列检查,我使用 ls -rt 按修改时间的顺序选择文件,并与之前的文件序列号进行比较。如果前一个文件是 9999,我检查下一个文件是否是 0001(以适应序列重置)。

最近我遇到一个场景,文件按以下顺序列出:

FILENAME_0001 
FILENAME_0002
FILENAME_0005
FILENAME_0003
FILENAME_0004
FILENAME_0006
FILENAME_0007

这是因为文件 3、4 和 5 的修改时间与秒相同。只是毫秒不同。所以我猜测 ls -rt 仅考虑秒数。有人可以建议一个解决方法吗?

答案1

如果您findprintf,请打印出以秒为单位的 mtime,后跟文件名,然后使用sort,最后使用cut

find . -type f -printf "%T@\t%f\n" |
sort -k 1n -k 2 |
cut -f 2-

find 在每一行输出 TIMESTAMP FILENAME。排序首先按数字顺序对时间戳进行排序。如果时间戳相等,它将使用文件名作为最后的手段。剪切从输出中删除时间戳。

编辑:你的 perl 解决方案有效,但我会采取不同的做法。这是最简单的:

find . -type f -print | 
perl -lne 'print (((stat($_))[9]."\t".$_)' |
sort -k 1n -k 2 |
cut -f 2-

无需将时间转换为字符串并再次转换回来。只需将 stat 的 mtime 作为数值输出,就像 find 所做的那样。

答案2

终于成功了。我使用了下面的代码:

for FILENAME in $(ls...); do
FILE_TIME=$(perl -e '@d=localtime ((stat(shift))[9]); printf "%4d%02d%02d%02d%02d%02d\n", $d[5]+1900,$d[4]+1,$d[3],$d[2],$d[1],$d[0]' $FILENAME)
echo "$FILE_TIME $FILENAME"
done | sort -k 1n -k 2 | cut -d" " -f2

我用的是HP-UX系统。

相关内容