我需要批量重命名文件更改.-.
为.
目标:file.-.txt
现在file.txt
rename 's/.-./.' *.txt
不起作用。怎么了?
答案1
您没有使用 的 perl 版本,因为如果您使用的是,您会因替换表达式中缺少尾随rename
而收到错误。Substitution replacement not terminated at (eval 1) line 1.
/
因此,您需要使用以下语法“其他”rename
rename -vn -- '.-.' '.' *.txt
在这个特定的实例中,您实际上不需要引用源模式和目标模式,因为它们没有 shell glob 字符(*
等),但这是一个很好的做法,所以无论如何我都在这里完成了。
当您很高兴自己得到了适合您情况的东西时,请删除-v
(详细)和(无操作)中的一个或两个。-n
添加-a
选项以替换a
所有出现的.-.
与.
,例如,重命名foo.-.bar.-.txt
为foo.bar.txt
而不是foo.bar.-.txt
(注意它仍然会重命名file.-.-.txt
为file.-.txt
)或-l
替换l
ast 出现。
出于好奇,该rename
命令将s/.-./.
(是的,这七个字符)作为源模式,并将*.txt
glob 中的第一个匹配文件名作为目标模式。然后,它尝试将源模式与 glob 中的每个剩余文件进行匹配*.txt
。显然,这将无法匹配任何内容,并且因为没有语法错误,所以没有输出消息。
答案2
虽然我同意 @roaima 可能不是perl
基于 - 的变体之一,但对于基于 perl 的变体,其语法为:
rename 's/\.(-\.)+/./g' ./*.txt
要将所有.-.
以.
. 结尾的(非隐藏)文件名中所有出现的.txt
.例如,这将重命名-a-b.-.-.c.-.-.txt
为。-a-b.c.txt
s/.-././g
会将其重命名为-..-.c.-.txt
正.
则表达式运算符,它匹配任何字符并且需要转义以便匹配文字.
。
s/\.-\././g
会将其重命名为-a-b.-.c.-.txt
.
当然,还有重要的./
前缀,如果没有它,您就会在rename
.
对于所有类型的重命名,我更喜欢zsh
's ,zmv
因为它不存在大多数问题以及与所有rename
变体的不兼容性,并且会事先进行一些健全性检查。
autoload -Uz zmv
zmv '*.txt' '${f//.(-.)##/.}'
或者
zmv '(*).-(.txt)' '$1$2'
仅将-.-
之前的替换txt
为.
.
答案3
出什么问题了rename 's/.-./.' *.txt
- 您的 s 命令未关闭。
/
后面加一个 - 正如 roaima 所说,破折号“-”与下划线“_”不匹配