复制时重命名和增加

时间:2017-12-09 14:55:11

标签: linux bash file-rename batch-rename

我有一系列图像文件,文件名格式如下。

9407-C-9406-B-038.jpg
9407-C-9406-B-118.jpg
9422-AC-012.jpg
9422-AC-112.jpg
9422-BD-043.jpg
9422-BD-Still-001.jpg
9405_M.jpg
9792A.jpg
9792B.jpg

我的目的的相关部分是前4个字符,其余部分是无关紧要的。

我想重命名这些文件,以便保留前4个字符串,保留扩展名,但是当遇到重复时,其余字符串会增加: 例如:

9422-AC-012.jpg becomes 942200.jpg
9422-AC-112.jpg becomes 942201.jpg
9422-BD-043.jpg becomes 942202.jpg
9422-BD-Still-001.jpg becomes 942203.jpg
9405_M.jpg becomes 940500.jpg
9792A.jpg becomes 979200.jpg
9792B.jpg becomes 979201.jpg

使用'重命名'我可以在前4个字符后删除字符串,并且我可以增加总数,这会导致文件名的增量部分以数千个结尾。

rename -n -N 0001 's/(?<=.{4}).*/$N.jpg/' *.jpg

有人可以建议在前4个字符后删除文件名的方法,重命名文件,只在遇到重复时才增加?

1 个答案:

答案 0 :(得分:0)

awk救援!

使用文件

中列出的文件名
$ while read f t; 
  do 
     echo "mv $f $t"; 
  done < <(awk -F\. '{k=substr($0,1,4); printf "%s\t%s%04d.%s\n", $0,k,a[k]++,$NF}' file)

mv 9407-C-9406-B-038.jpg 94070000.jpg
mv 9407-C-9406-B-118.jpg 94070001.jpg
mv 9422-AC-012.jpg 94220000.jpg
mv 9422-AC-112.jpg 94220001.jpg
mv 9422-BD-043.jpg 94220002.jpg
mv 9422-BD-Still-001.jpg 94220003.jpg
mv 9405_M.jpg 94050000.jpg
mv 9792A.jpg 97920000.jpg
mv 9792B.jpg 97920001.jpg

删除echo以进行实际重命名,假设文件名中没有空格,至少有4个字符且有扩展名。

该示例显示了两位数的计数器,您提到计数器为数千,这里它由打印格式%04d控制,如果您不期望超过100,则更改4到2.无论如何, counter将创建唯一的文件,但可以从分配的位数扩展(例如,它将生成00,01,.. 99,而下一个将为100。)