![如何重命名包含 _ 和 . 的多个文件?](https://linux22.com/image/139814/%E5%A6%82%E4%BD%95%E9%87%8D%E5%91%BD%E5%90%8D%E5%8C%85%E5%90%AB%20_%20%E5%92%8C%20.%20%E7%9A%84%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6%EF%BC%9F.png)
在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
在示例中仅用于显示之前/之后。