Gil*_*not 8 perl regular-expression rename
这真是一团糟。当我们期望 Perl 使用s///
类似 sed 的语法重命名时,当有大量不同的 实现rename
,并且大多数情况下是 Perl 的不同版本rename.ul
(二进制)时,我如何知道使用哪个命令?
Gil*_*not 13
rename
用于批量重命名文件的最著名、最直观的工具是 Perl 的rename
. 它非常类似于sed
类固醇(但用于重命名文件)。
如果你想按预期的方式使用它,最好使用 Perl 的 CPAN 安装预期的版本。那里有太多版本。
\n请参阅下面的“通用 Perl CPAN 安装”。
\nsed
s///
如)它能够进行强大的正则表达式处理:
\nrename [options] \'s/<regex>/<replacement>/[modifiers]\' <FILE(S)>[*]\n<STDIN> | rename [options] \'s/<regex>/<replacement>/[modifiers]\'\n
Run Code Online (Sandbox Code Playgroud)\n如果要在 mp4 文件名的每个单词之间添加空格TitleCase
(PascalCase
以空格分隔的单词):
rename -n \'s/\\B[[:upper:]]/ $&/g\' ./*.mp4\nrename(./FooBarBaz.mp4, ./Foo Bar Baz.mp4)\n
Run Code Online (Sandbox Code Playgroud)\n删除-n
开关,也就是dry-run
当您的尝试成功重命名为 real时。
您甚至可以在该部分中注入调用replacement
,例如sprintf "%03d", 7
使用e
修饰符进行零填充:
$ touch {1..3}.txt\n$ rename -n \'s/(\\d+)\\.txt/sprintf "%03d", $1/e\' ./*.txt\nrename(1.txt, 001.txt)\nrename(2.txt, 002.txt)\nrename(3.txt, 003.txt)\n
Run Code Online (Sandbox Code Playgroud)\n-
使用捕获组分隔文本的相反顺序:
$ rename -n \'s/(\\w+)-(\\w+)-(\\w+)/$3-$2-$1/\' ./foo-bar-base.txt\nrename(foo-bar-base.txt, base-bar-foo.txt)\n
Run Code Online (Sandbox Code Playgroud)\n或使用Perl
这样的方式(TMTOWTDI):
$ rename -n \'s/(\\w+)-(\\w+)-(\\w+) # capture groups\n /join "-", reverse @{^CAPTURE}/xe\' foo-bar-base.txt\nrename(foo-bar-base.txt, base-bar-foo.txt)\n
Run Code Online (Sandbox Code Playgroud)\n你 (Wo|Do)n\xe2\x80\x99t 在五分钟内学会 Perl
\n\n\n花时间去掌握 Perl 是值得的。但是,要开始使用 rename 命令的省时功能,您根本不需要具备大量 Perl 知识,即可在功能、简单性和时间方面获得巨大优势。
\n
某些发行版上还使用了另一个同名的二进制工具。根据您的发行版,Perl 版本可以称为
perl-rename
、file-rename
、prename
或pname
。rename
\n还有一个Pythonrename
命令!
rename --version\n
Run Code Online (Sandbox Code Playgroud)\n应该看起来像这样:
\n/usr/bin/rename using File::Rename version 1.30, File::Rename::Options version 1.10\n
Run Code Online (Sandbox Code Playgroud)\n或者在旧版本上:
\nUnknown option: help\nUsage: rename [-v] [-n] [-f] perlexpr [filenames\n
Run Code Online (Sandbox Code Playgroud)\n或者
\nrename 2>&1 | grep -i perl\n [ -e|-E perlexpr]*|perlexpr [ files ]\n
Run Code Online (Sandbox Code Playgroud)\n而不是使用 rename
from 的东西util-linux
借用@mebeim 对 tldr-pages 的 GitHub 问题跟踪器的评论:
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n
珀尔(旧) Perl(新) Perl(其他?) C Linux(Debian) 名称 (pkg perl),已弃用 文件\xe2\x80\x91重命名(pkg重命名) 不适用 rename.ul(pkg util-linux) Linux(Ubuntu) 不适用 文件\xe2\x80\x91重命名(pkg重命名) 不适用 rename.ul(pkg util-linux) Linux(架构) 不适用 不适用 perl\xe2\x80\x91rename (pkg perl-rename) 重命名(pkg util-linux) Linux(CentOS、RHEL) 不适用 不适用 不适用 重命名(pkg util-linux) Linux(软呢帽) 不适用 不适用 名字(pkg 名字) 重命名(pkg util-linux) Linux(openSUSE) 不适用 不适用 不适用 重命名(pkg util-linux) macOS(自制) 不适用 不适用 重命名(包重命名) 重命名(pkg util-linux) 视窗 不适用 不适用 不适用 不适用 索拉里斯 不适用 不适用 不适用 不适用
在Windows上,rename
是一个完全不同的命令(因此我没有在上面列出它),但也可以使用,查看如何在Windows上使用Perl\的重命名
在 Solaris 上,不rename
存在命令
在 macOS 上,Homebrew 软件包rename
和util-linux
冲突
在 macOS 上,Homebrew 软件包rename
提供了一个看起来与其他脚本不同的 Perl 脚本
在 Arch Linux 上,该perl-rename
软件包提供了一个与其他脚本不同的 Perl 脚本
在 Feroda 上,prename
提供了一个与其他脚本不同的 Perl 脚本
在 Debian 上,prename
并且file-rename
是替代品rename
在 Ubuntu 上,file-rename
是唯一的选择rename
mksh有一个内置的rename
. 要使用 Perl rename
,必须使用完整路径:/usr/bin/rename
或定义一个alias rename=/usr/bin/rename
CPAN
使用或不使用 root 权限进行通用 Perl安装我推荐这种方式,因为周围有太多不同的版本。这样,您就可以准确地知道您将拥有哪个版本。
\ncpan -i File::Rename
最好使用perl brew )。该rename
命令将可用。如果没有,你的PATH
不包含 Perl 脚本实用程序。Debian*
dh-make-perl --build --cpan File::Rename
制作 Debian 软件包如果您无法安装任何东西,请将其作为独立脚本下载(简化的旧版本,没有依赖项(除了perl
)并且比新版本更少的开关)
rename
VS 发行版(如果不是好的发行版)如果您更喜欢系统包管理器:
\n这是 Debian(替代)操作系统上的默认命令(与 Arch Linux、基于发行版、Slackware 和 *BSDrename
不同)。rpm
rpm
基于的发行版:
dnf install prename\n
Run Code Online (Sandbox Code Playgroud)\nArch Linux/Manjaro:
\npacman -S perl-rename\n
Run Code Online (Sandbox Code Playgroud)\n根图:
\nemerge dev-perl/rename\n
Run Code Online (Sandbox Code Playgroud)\nNixO:
\nnix-env -i perl5.36.0-rename\nnix-env -iA nixos.perlRename\n
Run Code Online (Sandbox Code Playgroud)\n对于纯粹主义者来说,这不是推荐的方式。
\n*BSD:
\npkg install p5-File-Rename\n
Run Code Online (Sandbox Code Playgroud)\nAlpine Linux(在存储库edge
的分支中testing
,默认情况下不使用):
apk add perl-file-rename --repository=http://dl-cdn.alpinelinux.org/alpine/edge/testing/\n
Run Code Online (Sandbox Code Playgroud)\n苹果系统:
\nbrew install rename\n
Run Code Online (Sandbox Code Playgroud)\n类似 Debian/Ubuntu:
\napt install rename\n
Run Code Online (Sandbox Code Playgroud)\n松弛软件:slackbuild
\\d
,\\w
\\s
...(PCRE、Perl、Python、PHP)还有一个特定的 Unicoderename
实现:Unicode::Tussle
如果您的文件包含连续的 Unicode UTF8 字符,例如Aaa\xc3\x83\xc3\xa9\xc3\xa9Zzz.mp4
Unicode 部分将被忽略。一种解决方案是使用特殊开关unicode
:
\n\n-u, --unicode [编码]
\n运行用户提供的代码时,将文件名视为 perl (unicode) 字符串。
\n使用编码对文件名进行解码/编码(如果存在)。
\n编码是可选的:如果省略,下一个参数应该是以“-”开头的选项,例如-e。
\n
或者如果您有一个没有的(旧)版本-u
,您可以执行以下操作:
PERL_UNICODE=ASD rename -n \'s/\\B\\p{Lu}/ $&/g\' ./*.mp4\n
Run Code Online (Sandbox Code Playgroud)\n查看
\nperldoc perlrun | less +/PERL_UNICODE\n
Run Code Online (Sandbox Code Playgroud)\n为了避免可能的shell 注入(感谢@Stephane Chazelas):
\nrename -n \'s/.*//\' \'--e=system"uname"#.mp4\'\nLinux\n
Run Code Online (Sandbox Code Playgroud)\n养成使用习惯:(最便携)
\n rename -n \'s/.*//\' ./*\n
Run Code Online (Sandbox Code Playgroud)\n或者如果支持:
\nrename -n \'s/.*//\' -- *\n
Run Code Online (Sandbox Code Playgroud)\n它既可以防止shell 注入,又可以将以 开头的文件视为-
开关。
\n尝试重命名文件,例如rename -n \'s/.*//\' -foobar.txt