使用正则表达式在 Bash 中重命名文件

使用正则表达式在 Bash 中重命名文件

我有一个名为的文件35554842200284685106000166550020003504201637715423.xml,我只需将其重命名为42200284685106000166550020003504201637715423.xml(删除最后 48 个字符之前的所有内容)。这个简单的正则表达式 ( .{48}$) 可以提取最后 48 个字符,但我无法使其rename在 Bash 中使用。

如何使用rename此正则表达式将其重命名为仅最后 48 个字符?

编辑:

输出rename --help

[root@ip-000-00-0-000 tmp]# rename --help

Usage:
 rename [options] <expression> <replacement> <file>...

Rename files.

Options:
 -v, --verbose    explain what is being done
 -s, --symlink    act on the target of symlinks
 -n, --no-act     do not make any changes

 -h, --help     display this help and exit
 -V, --version  output version information and exit

For more details see rename(1).

谢谢。

答案1

您实际上不需要rename这里,您可以解决它:

$ file=35554842200284685106000166550020003504201637715423.xml
$ newname=$(sed -E 's/.*(.{48})/\1/'<<<"$file"); 
$ mv -v "$file" "$newname"
renamed '35554842200284685106000166550020003504201637715423.xml' -> '42200284685106000166550020003504201637715423.xml'

答案2

这是一个使用 bash 特定的聚乙烯醇参数扩展。

file=35554842200284685106000166550020003504201637715423.xml

仅用于外部工具的 mv

mv -v "$file" "${file:6}"

输出

renamed '35554842200284685106000166550020003504201637715423.xml' -> '42200284685106000166550020003504201637715423.xml'

保留最后 48 个字符即可。

mv -v "$file" "${file:(-48)}"

答案3

你的rename似乎是无用的util-linux

prename如果您想使用正则表达式,您需要确保安装一种基于 perl 的变体(有时称为)。进而:

rename -n 's:^\./\d+(?=\d{44}\.xml\Z)::' ./*.xml

(这里用 44 位数字替换 48 个字符,以便.xml更具体)。

或者,您可以使用zsh's zmv

autoload zmv
zmv -n '[0-9]##([0-9](#c44).xml)' '$1'

或者

zmv -n '<->.xml~^?(#c48)' '$f[-48,-1]'

(删除-n(空运行)以实际执行此操作)。

这还有一个好处是可以防止冲突(两个文件具有相同的目标名称)

使用bash,您可以执行以下操作:

shopt -s extglob nullglob
for f in +([[:digit:]]).xml; do
  ((${#f) <= 48)) || echo mv -i -- "$f" "${f: -48}"
done

答案4

file=35554842200284685106000166550020003504201637715423.xml
rename  "s/"$file"/"${file: -48}"/" *.xml

rename --version

/usr/bin/rename using File::Rename version 1.10

相关内容