根据修改日期时间戳对一堆文件进行编号?

根据修改日期时间戳对一堆文件进行编号?

所以我按时间顺序下载了一堆文档,但我必须复制并编辑它们,这会更改修改日期。我想按照我下载它们的顺序在它们前面添加一个数字(001_,002_...)。

答案1

zsh

autoload zmv
n=0; zmv -n '*(#qOm)' '${(l[3][0])$((++n))}_$f'

(高兴时删除-n(用于空运行))。

那是:

  • zmv:使用 zsh 扩展 glob 和替换运算符重命名文件的自动加载函数
  • *:当前目录下所有非隐藏文件
  • (#q...):引入全局限定符的详细形式
  • Om:按年龄倒序排列。所以最新的最后。
  • ${(l[3][0])$((++n))}$((++n)):在宽度 3 上用 0向左填充扩展。
  • _$f并追加_和原始文件名

答案2

找到了解决方案这里

ls -1tr |重命名 -v 's/.*/our $i;if(!$i){$i=1;} sprintf("%04d.pdf", $i++)/e'

答案3

find . -type f -printf '%C@ %p\0' |
  sort -z -n |
  awk  'BEGIN{RS=ORS="\0"};{print $2}' | 
  rename -0 -n 'our $i;
                s:(^.*/)([^/]*):sprintf("%s%04d_%s",$1,++$i,$2):e'

这使用 GNUfind打印 NUL 分隔的文件名(%p,即完整路径),并以%C@UNIX 纪元以来的秒数数字格式为其修改时间戳 ( ) 和空格字符作为前缀。

如果需要,您可以使用find此处的任何其他选项来优化文件搜索(例如-name "*.pdf",,-maxdepth 2等)

findsort然后,使用选项将 NUL 分隔的输入以数字方式(按时间戳)排序,将的输出通过管道输送到 GNU,-z -n然后输送到 awk 以去除时间戳和空格,最后通过管道输送到 perl 重命名脚本。

perl 重命名脚本使用该-0选项从 STDIN 读取 NUL 分隔的记录,然后:

  • sprintf()与 '%s%04d_%s' 一起使用(%04d_零填充、4 位数字宽和下划线),用作$i计数器来替换名称的文件名部分。

    $1是完整文件名的路径部分,$++i是自动递增计数器变量,$2是基本文件名。

  • $i声明为our使其成为全局变量,因此它会在循环的每次迭代中保留其值(否则每次都会重置为零)。

-n选项将其变成一次试运行操作,以便它仅显示被重命名。一旦您确定它会执行您想要的操作,请删除-n以悄悄地重命名没有输出的文件,或将其替换-v为详细输出。

ls -1tr与使用此意志不同不是如果任何文件名包含换行符,则中断。它将与任何有效的文件名。


仅供参考,要在每个文件名后附加格式良好的日期,请参阅我的rename脚本在文件名末尾重命名一堆带有修改日期时间戳的文件?。这很容易修改为在文件名中添加日期和时间前缀。它stat在每个文件上运行以获取时间戳,因此不需要对文件名进行预先排序。

例如

rename -n 'BEGIN {use Date::Format};
           die $! unless -f $_;
           next if (m/^\d{8}-$/);
           my $ts=(stat($_))[9];
           my $dt=time2str("%Y%m%d-%H%M%S",$ts);
           $_ = "$dt-$_"' *.pdf

相关内容