在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
在示例中仅用于显示之前/之后。