如何重命名包含 _ 和 . 的多个文件?

如何重命名包含 _ 和 . 的多个文件?

在linux bash shell中,我有多个tif文件(大约1000个),如下所示:

Sep04_17.00.37.tif  Sep04_17.05.54.tif  Sep04_17.08.41.tif
Sep04_17.02.02.tif  Sep04_17.07.17.tif

如何删除 _ 和 .在名字中?最终结果应该是:

Sep04170037.tif  Sep04170554.tif  Sep04170841.tif
Sep04170202.tif  Sep04170717.tif

我尝试过重命名:rename 's/\_/\//' *.tif ; rename 's/\_/\//g' *.tif;它们都不起作用。

答案1

你的方法是正确的。也许您错过了g正则表达式中的尾部,该表达式可以匹配每个文件名中出现的所有._

对于与 一起使用rename,我建议采用这种两步方法:

rename 's/[._]//g' *.tif    # remove any . and _ occurence

产量:

Sep04170037tif Sep04170202tif Sep04170554tif Sep04170717tif Sep04170841tif

然后

rename 's/tif$/.tif/' *tif    # replace ending tif by .tif

导致

Sep04170037.tif Sep04170202.tif Sep04170554.tif Sep04170717.tif Sep04170841.tif

请毫不犹豫地首先在线尝试您的正则表达式,例如正则表达式101,这也教给你很多关于 PCRE 的知识:)


[编辑]:如果你喜欢单行:

rename 's/[._]//g;s/tif$/.tif/' *.tif

还将避免匹配不幸的相邻不相关文件,这些文件不幸也会在tif第二步中结束。

答案2

一种变体使用sed

for file in *tif; do newname=$(echo "$file" | sed 's/_//;s/\.\([0-9]\)/\1/g'); mv -v "$file" "$newname"; done
'Sep04_17.00.37.tif' -> 'Sep04170037.tif'
'Sep04_17.02.02.tif' -> 'Sep04170202.tif'
'Sep04_17.05.54.tif' -> 'Sep04170554.tif'
'Sep04_17.07.17.tif' -> 'Sep04170717.tif'
'Sep04_17.08.41.tif' -> 'Sep04170841.tif'

mv -v在示例中仅用于显示之前/之后。

相关内容