我有一个名为的文件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)
你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)