使用 bash 批量重命名文件

使用 bash 批量重命名文件

我需要批量重命名文件更改.-..

目标: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.-.txtfoo.bar.txt而不是foo.bar.-.txt(注意它仍然会重命名file.-.-.txtfile.-.txt)或-l替换last 出现。

出于好奇,该rename命令将s/.-./.(是的,这七个字符)作为源模式,并将*.txtglob 中的第一个匹配文件名作为目标模式。然后,它尝试将源模式与 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

  1. 您的 s 命令未关闭。/后面加一个
  2. 正如 roaima 所说,破折号“-”与下划线“_”不匹配

相关内容