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

掌握 Linux 世界的文件重命名动力,让 mv
和您自己休息一下。 Rename
灵活、快速,有时甚至更容易。这是一个命令的强大教程。
mv有什么问题?
mv
没有任何问题。这个命令做得很好,它可以在所有 Linux 发行版、macOS 和其他类 Unix 操作系统中找到。所以它总是可用的。但有时您只需要推土机,而不是铲子。
mv
命令在生活中有一个用途,那就是移动文件。这是一个令人高兴的副作用,它可用于将现有文件移动到具有新名称的新文件。最终效果是重命名文件,所以我们得到了我们想要的。但是 mv
并不是专门的文件重命名工具。
使用 mv 重命名单个文件
要使用 mv
重命名文件类型 mv
、空格、文件名、空格和您希望文件具有的新名称。然后按回车。
您可以使用 ls
检查文件是否已重命名。
mv oldfile.txt newfile.txt
ls *.txt

使用 mv 重命名多个文件
当您想要重命名多个文件时,事情会变得更加棘手。 mv
无法处理重命名多个文件。您必须求助于使用一些巧妙的 Bash 技巧。如果您了解一些中级命令行功能,那很好,但是使用 mv
重命名多个文件的复杂性与使用 mv
重命名一个文件的简便性形成鲜明对比单个文件。
事情迅速升级。
假设我们有一个目录,其中包含各种不同类型的文件。其中一些文件具有“.prog”扩展名。我们想在命令行重命名它们,使它们具有“.prg”扩展名。
我们如何让 mv
为我们做到这一点?让我们看一下这些文件。
ls *.prog -l

这是一种不需要编写实际 Bash 脚本文件的方法。
for f in *.prog; do mv -- "$f" "${f%.prog}.prg"; done

有用吗?让我们检查文件看看。
ls *.pr*

所以,是的,它奏效了。现在都是“.prg”文件,目录下没有“.prog”文件。
刚刚发生了什么?
那个长命令实际上做了什么?让我们分解一下。
for f in *.prog; do mv -- "$f" "${f%.prog}.prg"; done
第一部分启动一个循环,依次处理目录中的每个“.prog”文件。
下一部分说明处理将做什么。它使用 mv
将每个文件移动到一个新文件。新文件将使用原始文件的名称命名,不包括“.prog”部分。将改用“.prg”的新扩展名。
最后一部分在处理完每个文件后结束循环。
必须有更简单的方法
明确地。它是 rename
命令。
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

让我们再做一次
这次我们将使用 rename
。我们将回滚时钟,以便我们有一组“.prog”文件。
ls *.prog

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

这行得通,它们现在都是“.prg”文件,目录中没有“.prog”文件。
这次发生了什么?
让我们分三个部分来解释一下这个魔法。
first 部分是命令名称,rename
(或 prename
或 perl-rename
,用于其他发行版) .
最后 部分是*.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_”开头的。让我们完全摆脱它。
rename
命令遵循与以前相同的格式。我们将寻找“.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 的元字符来改进中间表达式的行为。元字符是表示字符位置或序列的符号。例如,^
表示“字符串的开头”,$
表示“字符串的结尾”,.
表示任何单个字符(除来自换行符)。
我们将使用字符串元字符的开头 (^
) 将我们的搜索限制在文件名的开头。
ls *param*.c
rename 's/^parameter/value/' *.c
ls *param*.c
ls value*.c

列出了我们之前重命名的文件,我们可以看到字符串“parameter”位于三个文件名的开头和其中一个文件名的结尾。
我们的 rename
命令在搜索词“参数”之前使用行首 (^
) 元字符。这告诉 rename
仅当搜索词位于文件名的开头时才将其视为已找到。如果搜索字符串“parameter”在文件名中的其他任何位置,它将被忽略。
使用 ls
检查,我们可以看到在文件名末尾 有“parameter”的文件名没有被修改,但是三个有“parameter”的文件名在他们名字的开头已将搜索字符串替换为替代词“值”。
rename
的强大之处在于 Perl 的强大功能。 Perl 的所有强大功能都可供您使用。
分组搜索
rename
还有更多技巧。让我们考虑一下您可能拥有名称中包含相似字符串的文件的情况。它们不是完全相同的字符串,因此简单的搜索和替换在这里不起作用。
在此示例中,我们使用 ls
检查我们有哪些以“str”开头的文件。其中有两个,string.c 和 strangle.c。我们可以使用称为分组的技术一次重命名两个字符串。
此 rename
命令的中心表达式将在文件名中搜索具有字符序列“stri”或“stra”的字符串,其中这些序列紧跟“ng”。换句话说,我们的搜索词将寻找“字符串”和“strang”。替代词是“砰”。
ls str*.c
rename 's/(stri|stra)ng/bang/' *.c
ls ban*.c

再次使用 ls
确认 string.c 已变为 bang.c,strangle.c 现在变为 bangle.c。
将翻译与重命名一起使用
rename
命令可以对文件名执行称为翻译的操作。一个简单的翻译示例是将一组文件名强制转换为大写。
在下面的 rename
命令中,请注意我们没有使用 s/
来启动中心表达式,我们使用的是 y/
。这告诉 rename
我们没有执行替换;我们正在进行翻译。
a-z
术语是一个 Perl 表达式,表示从 a 到 z 的序列中的所有小写字符。同样,A-Z
项代表从 A 到 Z 序列中的所有大写字母。
该命令的中心表达式可以解释为“如果在文件名中找到从 a 到 z 的任何小写字母,则将它们替换为从 A 到 Z 的大写字符序列中的相应字符。”
要将所有“.prg”文件的文件名强制为大写,请使用以下命令:
重命名“y/a-z/A-Z/”*.prg
ls *.PRG

ls
命令向我们展示了所有“.prg”文件名现在都是大写的。事实上,严格来说,它们不再是“.prg”文件了。它们是“.PRG”文件。 Linux 区分大小写。
我们可以通过反转中心表达式中 a-z
和 A-Z
项的位置来反转最后一条命令。
重命名“y/A-Z/a-z/”*.PRG
ls *.prg

你(不会|不会)在五分钟内学会 Perl
掌握 Perl 是值得的。但是要开始使用 rename
命令的省时功能,您根本不需要具备太多 Perl 知识,就可以在功能、简单性和时间方面获得巨大好处。
Linux Commands | ||
Files | tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm · scp · gzip · chattr · cut · find · umask · wc | |
Processes | alias · screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · wall · yes · kill · sleep · sudo · su · time · groupadd · usermod · groups · lshw · shutdown · reboot · halt · poweroff · passwd · lscpu · crontab · date · bg · fg · pidof · nohup · pmap | |
Networking | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw · arping · firewalld |
RELATED: Best Linux Laptops for Developers and Enthusiasts