在提出这个问题之前,我做了很多研究。我找到了不同的链接,可以使用正则表达式进行批量重命名,例如:
我的问题是这样的,我想使用正则表达式进行批量重命名,但我的代码不起作用。
我在一个文件夹中有不同的文件,其名称如下:
name_house_1_door.jpg
name_house_2_door.jpg
name_house_3_door.jpg
name_house_4_door.jpg
我想重命名这些文件,如下所示:
name_house_1.jpg
name_house_2.jpg
name_house_3.jpg
name_house_4.jpg
最接近我想要的代码是:
$ rename -v 's/house\_[0-9]\_door/house_[0-9]/'
但你应该知道第一个文件被重命名为:name_house_[0-9].jpg
答案1
一个更简单的方法是_door
使用重命名来删除:
rename -v 's/_door//' *
这将搜索_door
并替换为空,本质上就是将其删除。
答案2
- 您正在表达式的搜索端转义下划线,但不应该这样做。
- 您需要一个子搜索(数字)和一个占位符来存储和使用子搜索的结果。
在 [0-9] 周围添加括号将创建所需的子搜索。由于它是第一个子搜索,因此可以在替换端将其称为 $1。结果如下。
rename -v 's/house_([0-9])\_door/house_$1/' *
希望这可以帮助。
答案3
你需要使用反向引用。字符类在替换表达式中没有任何意义。事实上,替换表达式中很少有字符具有特殊含义。我猜是这样的:
rename -v 's/house_([0-9])_door/house_$1/'
(或者)
rename -v 's/(house_[0-9])_door/$1/'
此外,-n
在实际执行重命名之前,请使用标志来查看将发生什么重命名。
答案4
这在 Fish Shell 中有效
for file in *.jpg;
mv -n $file (basename $file _door.jpg).jpg;
end