Alan Asked: 2022-10-01 14:24:03 +0800 CST2022-10-01 14:24:03 +0800 CST 2022-10-01 14:24:03 +0800 CST 使用 bash 批量重命名文件 772 我需要批量重命名文件更改.-.为. 目标:file.-.txt现在file.txt rename 's/.-./.' *.txt 不工作。怎么了? rename 3 个回答 Voted roaima 2022-10-02T06:40:31+08:002022-10-02T06:40:31+08:00 您没有使用 的 perl 版本,因为如果您使用的话,由于替换表达式中缺少尾随,rename您会收到错误。Substitution replacement not terminated at (eval 1) line 1./ 因此,您需要使用“其他”的语法rename rename -vn -- '.-.' '.' *.txt 在这个特定的例子中,您实际上不需要引用源模式和目标模式,因为它们没有 shell glob 字符(*等),但这是一种很好的做法,所以无论如何我已经在这里完成了。 当你很高兴你有适合你情况的东西时,删除一个或两个-v(冗长)和(不采取行动)。-n添加-a选项以替换a所有出现的.-.with .,例如,重命名foo.-.bar.-.txt为foo.bar.txt而不是foo.bar.-.txt(注意它仍会重命名file.-.-.txt为file.-.txt)或-l替换last 出现。 出于好奇,该rename命令将s/.-./.(是的,这七个字符)作为源模式,并将*.txtglob 中的第一个匹配文件名作为目标模式。然后它尝试将源模式与*.txtglob 中剩余的每个文件进行匹配。显然,这将无法匹配任何内容,并且因为没有语法错误,所以没有输出消息。 Best Answer Stéphane Chazelas 2022-10-02T07:26:47+08:002022-10-02T07:26:47+08:00 虽然我同意 @roaima 可能不是基于 - 的变体之一,但对于perl基于 perl 的变体,其语法为: rename 's/\.(-\.)+/./g' ./*.txt 替换所有.-.以. 例如,这将重命名。..txt-a-b.-.-.c.-.-.txt-a-b.c.txt s/.-././g将其重命名为-..-.c.-.txtas .is 一个匹配任何字符并且需要转义的正则表达式运算符,以便它匹配文字.. s/\.-\././g将其重命名为-a-b.-.c.-.txt. 当然还有重要的./前缀,没有它会在rename. 对于所有类型的重命名,我更喜欢zsh's zmv,因为它没有大多数问题和与所有rename变体的不兼容性,并且事先会进行一些健全性检查。 autoload -Uz zmv zmv '*.txt' '${f//.(-.)##/.}' 或者 zmv '(*).-(.txt)' '$1$2' 仅将-.-之前txt的替换为.. db-inf 2022-10-01T14:46:14+08:002022-10-01T14:46:14+08:00 出什么问题了rename 's/.-./.' *.txt 您的 s 命令未关闭。/在后面加一个 正如 roaima sais,破折号 '-' 与下划线 '_' 不匹配
您没有使用 的 perl 版本,因为如果您使用的话,由于替换表达式中缺少尾随,
rename
您会收到错误。Substitution replacement not terminated at (eval 1) line 1.
/
因此,您需要使用“其他”的语法
rename
在这个特定的例子中,您实际上不需要引用源模式和目标模式,因为它们没有 shell glob 字符(
*
等),但这是一种很好的做法,所以无论如何我已经在这里完成了。当你很高兴你有适合你情况的东西时,删除一个或两个
-v
(冗长)和(不采取行动)。-n
添加-a
选项以替换a
所有出现的.-.
with.
,例如,重命名foo.-.bar.-.txt
为foo.bar.txt
而不是foo.bar.-.txt
(注意它仍会重命名file.-.-.txt
为file.-.txt
)或-l
替换l
ast 出现。出于好奇,该
rename
命令将s/.-./.
(是的,这七个字符)作为源模式,并将*.txt
glob 中的第一个匹配文件名作为目标模式。然后它尝试将源模式与*.txt
glob 中剩余的每个文件进行匹配。显然,这将无法匹配任何内容,并且因为没有语法错误,所以没有输出消息。虽然我同意 @roaima 可能不是基于 - 的变体之一,但对于
perl
基于 perl 的变体,其语法为:替换所有
.-.
以. 例如,这将重命名。.
.txt
-a-b.-.-.c.-.-.txt
-a-b.c.txt
s/.-././g
将其重命名为-..-.c.-.txt
as.
is 一个匹配任何字符并且需要转义的正则表达式运算符,以便它匹配文字.
.s/\.-\././g
将其重命名为-a-b.-.c.-.txt
.当然还有重要的
./
前缀,没有它会在rename
.对于所有类型的重命名,我更喜欢
zsh
'szmv
,因为它没有大多数问题和与所有rename
变体的不兼容性,并且事先会进行一些健全性检查。或者
仅将
-.-
之前txt
的替换为.
.出什么问题了
rename 's/.-./.' *.txt
/
在后面加一个