所以我按时间顺序下载了一堆文档,但我必须复制并编辑它们,这会更改修改日期。我想按照我下载它们的顺序在它们前面添加一个数字(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
等)
find
sort
然后,使用选项将 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