如何在 Linux 上使用重命名命令

掌握 Linux 世界的文件重命名强国,让 mv 和您自己休息一下。 重命名灵活、快速,有时甚至更容易。 这是这个强大的命令的教程。

mv怎么了?

mv 没有任何问题。 该命令确实 一份好工作, 它存在于所有 Linux 发行版、macOS 和其他类 Unix 操作系统中。 所以它总是可用的。 但有时你只需要推土机,而不是铲子。

mv 命令在生活中有一个目的,那就是移动文件。 它可以用来将现有文件移动到具有新名称的新文件中,这是一个令人愉快的副作用。 最终效果是重命名文件,所以我们得到了我们想要的。 但 mv 不是专用的文件重命名工具。

使用 mv 重命名单个文件

要使用 mv 重命名文件类型 mv、空格、文件名、空格以及您希望文件具有的新名称。 然后按 Enter。

您可以使用 ls 检查文件是否已重命名。

mv oldfile.txt newfile.txt
ls *.txt

使用 mv 重命名多个文件

当您想要重命名多个文件时,事情会变得更加棘手。 mv 无法处理重命名多个文件。 您必须使用一些漂亮的 Bash 技巧。 如果您知道一些中级命令行 fu,那很好,但是使用 mv 重命名多个文件的复杂性与使用 mv 重命名单个文件的易用性形成鲜明对比。

事态迅速升级。

假设我们有一个目录,其中包含各种不同类型的文件。 其中一些文件具有“.prog”扩展名。 我们想在命令行重命名它们,使它们具有“.prg”扩展名。

我们如何让 mv 为我们这样做? 让我们看一下文件。

ls *.prog -l

这是一种不需要编写实际 Bash 脚本文件的方法。

for f in *.prog; do mv -- "$f" "${f%.prog}.prg"

*.prog 中的 f; 做MV——

那行得通吗? 让我们检查一下文件,看看。

ls *.pr*

所以,是的,它奏效了。 它们现在都是“.prg”文件,目录中没有“.prog”文件。

  如何在 Linux 上使用 nmap 查看网络上的所有设备

刚才发生了什么?

那个长命令实际上做了什么? 让我们分解一下。

for f in *.prog; do mv -- "$f" "${f%.prog}.prg"

第一部分开始一个循环,依次处理目录中的每个“.prog”文件。

下一部分说明处理将做什么。 它使用 mv 将每个文件移动到一个新文件。 新文件将以原始文件的名称命名,不包括“.prog”部分。 将使用“.prg”的新扩展名。

必须有一个更简单的方法

明确地。 这是重命名命令。

rename 不是标准 Linux 发行版的一部分,因此您需要安装它。 它在不同的 Linux 系列中也有不同的名称,但它们的工作方式都相同。 您只需要根据您使用的 Linux 风格替换适当的命令名称。

在 Ubuntu 和 Debian 派生的发行版中,您安装 rename 如下:

sudo apt-get install rename

在 Fedora 和 RedHat 派生的发行版中,您可以像这样安装 prename。 请注意开头的“p”,它代表 Perl。

sudo dnf install prename

要在 Manjaro Linux 中安装它,请使用以下命令。 请注意,重命名命令称为 perl-rename。

sudo pacman -Syu perl-rename

让我们再做一次

这次我们将使用重命名。 我们将回滚时钟,以便我们拥有一组“.prog”文件。

ls *.prog

现在让我们使用以下命令重命名它们。 然后我们将检查 ls 是否有效。 如果您不使用 Ubuntu 或 Debian 派生的 Linux,请记住将 rename 替换为适合您的 Linux 的命令名称。

rename 's/.prog/.prg/' *.prog
ls *.pr*

这有效,它们现在都是“.prg”文件,并且目录中没有“.prog”文件。

这次发生了什么?

让我们分三个部分来解释这个魔法。

第一部分是命令名称 rename (或 prename 或 perl-rename ,对于其他发行版)。

  如何在 Linux 上使用 pushd 和 popd

最后一部分是 *.prog,它告诉 rename 对所有“.prog”文件进行操作。

中间部分定义了我们要对每个文件名完成的工作。 s 表示替代。 第一项 (.prog) 是 rename 将在每个文件名中搜索的内容,第二项 (.prg) 是它将被替换的内容。

命令的中间部分或中心表达式是 Perl ‘正则表达式‘ 这就是赋予 rename 命令灵活性的原因。

更改文件名的其他部分

到目前为止,我们已经更改了文件扩展名,让我们修改文件名的其他部分。

目录中有很多C源代码文件。 所有文件名都以“slang_”为前缀。 我们可以用 ls 来检查。

ls sl*.c

我们将用“sl_”替换所有出现的“slang_”。 命令的格式我们已经很熟悉了。 我们只是更改了搜索词、替换词和文件类型。

rename 's/slang_/sl_' *.c

这次我们正在寻找“.c”文件,并搜索“slang_”。 只要在文件名中找到“slang_”,它就会被“sl_”替换。

我们可以通过使用相同的参数从上面重复 ls 命令来检查该命令的结果:

ls sl*.c

删除文件名的一部分

我们可以通过用任何内容替换搜索词来删除文件名的一部分。

ls *.c
rename 's/sl_//' *.c
ls *.c

我们可以从 ls 命令中看到,我们的“.c”文件都以“sl_”开头。 让我们完全摆脱它。

重命名命令遵循与以前相同的格式。 我们将寻找“.c”文件。 搜索词是“sl_”,但没有替代词。 两个反斜杠之间没有任何东西意味着什么,一个空字符串。

rename 将依次处理每个“.c”文件。 它将在文件名中搜索“sl_”。 如果找到,它将被任何东西取代。 换言之,搜索词被删除。

ls 命令的第二次使用确认“sl_”前缀已从每个“.c”文件中删除。

限制对文件名特定部分的更改

让我们使用 ls 查看文件名中包含字符串“param”的文件。 然后我们将使用 rename 将该字符串替换为字符串“parameter”。 我们将再次使用 ls 来查看 rename 命令对这些文件的影响。

ls *param*
rename 's/param/parameter' *.c
ls *param*

找到四个文件名中包含“param”的文件。 param.c、param_one.c 和 param_two.c 的名称开头都有“param”。 third_param.c 的名称末尾有“param”,就在扩展名之前。

rename 命令将在文件名中的所有位置搜索“param”,并在所有情况下将其替换为“parameter”。

ls 命令的第二次使用向我们展示了这正是发生的事情。 无论“param”是在文件名的开头还是结尾,它都已被“parameter”替换。

我们可以使用 Perl 的元字符来改进中间表达式的行为。 元字符是表示字符位置或序列的符号。 例如,^ 表示“字符串的开头”,$ 表示“字符串的结尾”,而 . 表示任何单个字符(换行符除外)。

  如何在 Linux 上使用 Keybase 加密文件

我们将使用字符串元字符 (^) 的开头来将搜索限制在文件名的开头。

ls *param*.c
rename 's/^parameter/value/' *.c
ls *param*.c
ls value*.c

列出了我们之前重命名的文件,我们可以看到字符串“参数”位于三个文件名的开头,它位于其中一个文件名的末尾。

我们的重命名命令在搜索词“参数”之前使用行首 (^) 元字符。 这告诉 rename 仅考虑在文件名开头的搜索词已找到。 如果搜索字符串“参数”位于文件名中的任何其他位置,则将被忽略。

用 ls 检查,我们可以看到文件名末尾有“parameter”的文件名没有被修改,但是名字开头有“parameter”的三个文件名已经将搜索字符串替换为替换术语“价值”。

重命名的力量在于 Perl 的力量。 全部 Perl的力量 随时为您服务。

分组搜索

rename 还有更多花招。 让我们考虑一下文件名中可能包含相似字符串的情况。 它们不是完全相同的字符串,因此简单的搜索和替换在这里不起作用。

在这个例子中,我们使用 ls 检查我们有哪些以“str”开头的文件。 其中有两个,string.c 和 strangle.c。 我们可以使用一种称为分组的技术一次重命名两个字符串。

此重命名命令的中心表达式将在文件名中搜索具有字符序列“stri”或“stra”的字符串,这些序列后面紧跟“ng”。 换句话说,我们的搜索词将寻找“string”和“strang”。 替代术语是“砰”。

ls str*.c
rename 's/(stri|stra)ng/bang/' *.c
ls ban*.c

再次使用 ls 确认 string.c 已变为 bang.c 并且 strangle.c 现在为 bangle.c。

使用带有重命名的翻译

rename 命令可以对称为翻译的文件名执行操作。 一个简单的翻译示例是强制一组文件名变成大写。

请注意,在下面的重命名命令中,我们没有使用 s/ 来启动中心表达式,而是使用 y/。 这告诉 rename 我们没有执行替换; 我们正在翻译。

az 术语是一个 Perl 表达式,表示从 a 到 z 序列中的所有小写字符。 同样,AZ 项表示从 A 到 Z 序列中的所有大写字母。

该命令的中心表达式可以解释为“如果在文件名中找到从 a 到 z 的任何小写字母,则将它们替换为从 A 到 Z 的大写字符序列中的相应字符。”

要将所有“.prg”文件的文件名强制为大写,请使用以下命令:

重命名 ‘y/az/AZ/’ *.prg

ls *.PRG

ls 命令显示所有“.prg”文件名现在都是大写的。 事实上,严格来说,它们不再是“.prg”文件了。 它们是“.PRG”文件。 Linux 区分大小写。

我们可以通过反转中心表达式中 az 和 AZ 项的位置来反转最后一个命令。

重命名 ‘y/AZ/az/’ *.PRG

ls *.prg

你(Wo|Do)不会在五分钟内学会 Perl

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