![使用正则表达式在 Bash 中重命名文件](https://linux22.com/image/168078/%E4%BD%BF%E7%94%A8%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%9C%A8%20Bash%20%E4%B8%AD%E9%87%8D%E5%91%BD%E5%90%8D%E6%96%87%E4%BB%B6.png)
我有一个名为的文件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