重命名命令有哪些不同版本?如何使用 Perl 版本?

Gil*_*not 8 perl regular-expression rename

这真是一团糟。当我们期望 Perl 使用s///类似 sed 的语法重命名时,当有大量不同的 实现rename,并且大多数情况下是 Perl 的不同版本rename.ul(二进制)时,我如何知道使用哪个命令?

Gil*_*not 13

Perl 的rename

\n

用于批量重命名文件的最著名、最直观的工具是 Perl 的rename. 它非常类似于sed类固醇(但用于重命名文件)。

\n

长话短说

\n

如果你想按预期的方式使用它,最好使用 Perl 的 CPAN 安装预期的版本。那里有太多版本。

\n

请参阅下面的“通用 Perl CPAN 安装”。

\n

用法(sed s///如)

\n

它能够进行强大的正则表达式处理:

\n
rename [options] \'s/<regex>/<replacement>/[modifiers]\' <FILE(S)>[*]\n<STDIN> | rename [options] \'s/<regex>/<replacement>/[modifiers]\'\n
Run Code Online (Sandbox Code Playgroud)\n

例子

\n
    \n
  • 如果要在 mp4 文件名的每个单词之间添加空格TitleCasePascalCase空格分隔的单词):

    \n
    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时。

    \n
  • \n
  • 您甚至可以在该部分中注入调用replacement,例如sprintf "%03d", 7使用e修饰符进行零填充:

    \n
    $ 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
  • \n
  • -使用捕获组分隔文本的相反顺序:

    \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):

    \n
    $ 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
  • \n
\n

你 (Wo|Do)n\xe2\x80\x99t 在五分钟内学会 Perl

\n
\n

花时间去掌握 Perl 是值得的。但是,要开始使用 rename 命令的省时功能,您根本不需要具备大量 Perl 知识,即可在功能、简单性和时间方面获得巨大优势。

\n
\n

检查你自己的版本

\n

笔记 某些发行版上还使用了另一个同名的二进制工具。根据您的发行版,Perl 版本可以称为perl-renamefile-renameprenamepnamerename
\n还有一个Pythonrename命令!

\n
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

或者在旧版本上:

\n
Unknown option: help\nUsage: rename [-v] [-n] [-f] perlexpr [filenames\n
Run Code Online (Sandbox Code Playgroud)\n

或者

\n
rename 2>&1 | grep -i perl\n    [ -e|-E perlexpr]*|perlexpr [ files ]\n
Run Code Online (Sandbox Code Playgroud)\n

而不是使用 renamefrom 的东西util-linux

\n

rename 命令的默认版本与发行版表

\n

借用@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
珀尔(旧)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)
视窗不适用不适用不适用不适用
索拉里斯不适用不适用不适用不适用
\n
\n

重要笔记:

\n
    \n
  • 在Windows上,rename是一个完全不同的命令(因此我没有在上面列出它),但也可以使用,查看如何在Windows上使用Perl\的重命名

    \n
  • \n
  • 在 Solaris 上,不rename存在命令

    \n
  • \n
  • 在 macOS 上,Homebrew 软件包renameutil-linux冲突

    \n
  • \n
  • 在 macOS 上,Homebrew 软件包rename提供了一个看起来与其他脚本不同的 Perl 脚本

    \n
  • \n
  • 在 Arch Linux 上,该perl-rename软件包提供了一个与其他脚本不同的 Perl 脚本

    \n
  • \n
  • 在 Feroda 上,prename提供了一个与其他脚本不同的 Perl 脚本

    \n
  • \n
  • 在 Debian 上,prename并且file-rename是替代品rename

    \n
  • \n
  • 在 Ubuntu 上,file-rename是唯一的选择rename

    \n
  • \n
  • mksh有一个内置的rename. 要使用 Perl rename,必须使用完整路径:/usr/bin/rename或定义一个alias rename=/usr/bin/rename

    \n
  • \n
\n

CPAN使用或不使用 root 权限进行通用 Perl安装

\n

我推荐这种方式,因为周围有太多不同的版本。这样,您就可以准确地知道您将拥有哪个版本。

\n
    \n
  • 使用(普通用户cpan -i File::Rename最好使用perl brew )。rename命令将可用。如果没有,你的PATH不包含 Perl 脚本实用程序。
  • \n
  • 用来Debian*dh-make-perl --build --cpan File::Rename制作 Debian 软件包
  • \n
\n

如果您无法安装任何东西,请将其作为独立脚本下载(简化的旧版本,没有依赖项(除了perl)并且比新版本更少的开关)

\n

测绘renameVS 发行版(如果不是好的发行版)

\n

如果您更喜欢系统包管理器:

\n

这是 Debian(替代)操作系统上的默认命令(与 Arch Linux、基于发行版、Slackware 和 *BSDrename不同)。rpm

\n\n

对于纯粹主义者来说,这不是推荐的方式

\n\n

文档

\n\n

统一码

\n

还有一个特定的 Unicoderename实现:Unicode::Tussle

\n

如果您的文件包含连续的 Unicode UTF8 字符,例如Aaa\xc3\x83\xc3\xa9\xc3\xa9Zzz.mp4Unicode 部分将被忽略。一种解决方案是使用特殊开关unicode

\n
\n

-u, --unicode [编码]

\n

运行用户提供的代码时,将文件名视为 perl (unicode) 字符串。

\n

使用编码对文件名进行解码/编码(如果存在)。

\n

编码是可选的:如果省略,下一个参数应该是以“-”开头的选项,例如-e。

\n
\n

或者如果您有一个没有的(旧)版本-u,您可以执行以下操作:

\n
PERL_UNICODE=ASD rename -n \'s/\\B\\p{Lu}/ $&/g\' ./*.mp4\n
Run Code Online (Sandbox Code Playgroud)\n

查看

\n
perldoc perlrun | less +/PERL_UNICODE\n
Run Code Online (Sandbox Code Playgroud)\n

安全

\n

为了避免可能的shell 注入(感谢@Stephane Chazelas):

\n
rename -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

或者如果支持:

\n
rename -n \'s/.*//\' -- *\n
Run Code Online (Sandbox Code Playgroud)\n

它既可以防止shell 注入,又可以将以 开头的文件视为-开关。
\n尝试重命名文件,例如rename -n \'s/.*//\' -foobar.txt

\n