我有大约一千个文件,看起来都像这样:
20091208170014.nc
20091211150704.nc
20091214131328.nc
20091217111953.nc
20091220092643.nc
20091223073308.nc
20091226053932.nc
20091229034557.nc
20091208171946.nc
20091211152610.nc
前八位是日期,后六位是连续数字,但这些数字之间的差异在文件之间并不相同。我希望最后六个数字是连续的并且始终使用相同的步骤。例如:
20091208000001.nc
20091211000002.nc
20091214000003.nc
20091217000004.nc
20091220000005.nc
20091223000006.nc
20091226000007.nc
20091229000008.nc
20091208000009.nc
20091211000010.nc
我使用https://www.ostechnix.com/how-to-rename-multiple-files-at-once-in-linux/mmv
等其他问题检查了该站点上的几个问题,但没有一个可以向我解释如何拥有我名字中的连续数字。
为了将此与问题Batch rename files to a sequence numbering区分开来,顺序排序必须基于最后六位数字,完全忽略前八个字符中的嵌入日期。
在 bash 中,并且没有碰撞检查:
通配符
[0-9]...
选择具有 8+6 (14) 位数字的文件名,后跟.nc
. 它遍历所有这些文件并重命名它们。目标文件名由三个部分生成:"${file:0:8}"
-- 现有文件名的前 8 个字符(日期)$(printf "%06d" "$index")
-- 一个 6 位的零填充索引.nc
-- 现有的扩展当我在您的示例文件上运行上述循环的“回声”版本时,我得到:
如果您安装了
perl
基于- 的rename
工具,有时称为prename
,您可以在一行中执行此操作,如下所示正如所写的,它只会告诉你它会做什么。当您满意时,删除
-n
以静默运行,或将其替换为-v
以查看发生了什么。如果您好奇,这将替换三个
(..)
部分(其中.{n}
代表n
字符,.*
代表任何东西,并且括号创建一个分组),并使用包含第一组和递增的六位数字的格式化打印结果。(不使用第二组。)第三组跨越文件扩展名。我应该注意它会拒绝覆盖现有文件。
样本输出
您似乎希望根据文件名的最后六位数字排序,完全忽略嵌入的日期。这里有几个选项。
如果您的文件足够少,shell 可以完全扩展列表,则对文件进行排序:
执行转换,使排序键暂时放在文件名的前面,然后重命名,然后替换它所属的位置:
和以前一样,删除
-n
以静默运行或将其替换为-v
以查看实际发生的情况。