我使用的是 Ubuntu,并且有很多文件。文件有两种类型。
"img_00000_c0_1283347740957299us.jpg"
"img_00000_c1_1283347740342342us.jpg"
它们通过 c0 或 c1 来区分。 “00000”位置的数字随着文件编号的增加而增加。例如,输入 c0,第 5 个文件的名称为“img_00005_c0_1283347740957299us.jpg”。问题是,“c0_”或“c1_”后面的长数字对我来说毫无意义,它们是随机数。它们并不总是“1283347740957299us”。因此我想重命名这些文件,只是删除最后的数字。
img_00005_c1_1283347740957299us.jpg ---> img_00005_c1.jpg
我在网上尝试了几个答案。例如,像这样的答案
for FILE in eventDataLog.txt.2015*; do mv "$FILE" "abc-$FILE"; done
我猜上面的代码来自这个答案会对我有帮助,但就我而言,重命名并不是添加字符。我还找到了一些关于减去名称部分的答案这里,但我的情况是随机数。
提前致谢!
答案1
有几个选项,都只是_
从名称末尾删除最短的后缀:
使用基于 perl 的
prename
命令$ prename -nv -- 's/_[^_]*\.jpg/.jpg/' *.jpg img_00000_c0_1283347740957299us.jpg renamed as img_00000_c0.jpg img_00000_c1_1283347740342342us.jpg renamed as img_00000_c1.jpg
n
(当您对输出满意时删除该选项)
使用 shell 参数扩展
$ for f in img_*.jpg; do echo mv -- "$f" "${f%_*}.jpg"; done mv -- img_00000_c0_1283347740957299us.jpg img_00000_c0.jpg mv -- img_00000_c1_1283347740342342us.jpg img_00000_c1.jpg
echo
(当您对输出满意时删除)。
如果您想更具体地匹配模式(即作为一个或多个十进制数字的序列,后跟us
),那么您可以这样做,但根据您提供的信息,这似乎没有必要。
答案2
字符串前面似乎有 16 位数字us
。您可以使用rename
总共删除这 18 个字符,如下所示。
rename -v 's/_(\d){16}us//' *.jpg
img_00000_c0_1283347740957299us.jpg renamed as img_00000_c0.jpg
img_00000_c1_1283347740342342us.jpg renamed as img_00000_c1.jpg
img_00005_c1_1283347740957299us.jpg renamed as img_00005_c1.jpg
(详细)选项-v
显示重命名的文件名。该(\d){16}
模式表示一组 16 位数字。上面显示的输出基于三个示例输入文件。您还可以多看看的例子rename
。