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

dev*_*ili 8 bash rename

我有一个名为的文件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).
Run Code Online (Sandbox Code Playgroud)

谢谢你。

ter*_*don 18

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

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


Jet*_*sel 15

这是一个使用 bash 特定的 PE 参数扩展。

file=35554842200284685106000166550020003504201637715423.xml
Run Code Online (Sandbox Code Playgroud)

仅 mv 用于外部工具

mv -v "$file" "${file:6}"
Run Code Online (Sandbox Code Playgroud)

输出

renamed '35554842200284685106000166550020003504201637715423.xml' -> '42200284685106000166550020003504201637715423.xml'
Run Code Online (Sandbox Code Playgroud)

保留最后 48 个字符将是。

mv -v "$file" "${file:(-48)}"
Run Code Online (Sandbox Code Playgroud)


Sté*_*las 9

rename似乎是从util-linux.

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

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

(此处替换您的 48 个字符,后跟 44 个数字.xml以便更具体)。

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

autoload zmv
zmv -n '[0-9]##([0-9](#c44).xml)' '$1'
Run Code Online (Sandbox Code Playgroud)

或者

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

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

这也有防止冲突的好处(两个文件具有相同的目标名称)

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

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