如何在 Linux 中重命名文件和目录?

9 Oct 2024 | 7 分钟阅读

要重命名文件,还有其他命令,如 **'mv'**。但是 **'rename'** 命令比其他命令稍微高级一些。这个命令很少使用,并且在不同的 Linux 发行版上工作方式不同。我们将以 Debian/Ubuntu 示例进行操作。

通常,重命名不是一个大问题,但是当您想一次重命名大量文件时,使用 'mv' 命令重命名会很困难。在这些情况下,建议使用 'rename' 命令。它可以将大写文件转换为小写文件,反之亦然,并可以使用 Perl 表达式覆盖文件。此命令是 Perl 脚本的一部分。

Linux 文件系统简介

Linux 文件系统提供操作系统的支持系统,为存储和检索目录和文件提供了一个有组织和结构化的平台。了解 Linux 文件系统的层次结构是必要的。文件系统以树状结构维护,其中 ('/') 根目录作为起点。多个目录及其子目录从根目录分支出来,构成整个文件系统。

在 Linux 中,所有目录都可以包含文件和其他目录,构成一个分层结构。分层结构允许轻松管理和组织目录和文件。了解文件系统层次结构有助于用户在 Linux 目录中导航,并有效地定位目录和文件。在命令行操作时,指定准确的路径以运行命令和访问目标文件很重要。

在 Linux 中,所有文件都由其路径识别,该路径描述了它们在文件系统中的位置。文件的路径包括指向文件的目录层次结构,后跟其名称。例如,/home/user/documents/text1.txt 路径表明 text1.txt 位于 documents 目录内,而 documents 目录位于 user 目录内。

基本语法

这个 ('s/old-name/new-name/') 是 PCRE(Perl 兼容正则表达式),它指定要重命名的文件以及如何重命名。

让我们看一个基本 rename 命令的示例

在下面的示例中,我们将所有以 **'.txt'** 结尾的文件转换为以 **'.pdf'** 结尾的文件。

linux-file-rename-command

在另一个示例中,我们将所有以 .pdf 结尾的文件转换为 document。

linux-file-rename-command

rename 选项

rename 包含一些可选参数,但每个选项都必须有一个 Perl 表达式,该表达式会指导其如何工作。

选项函数
rename -n在运行命令之前检查更改。
rename -v打印输出。
rename (a-z)(A-Z)/ (A-Z)(a-z)转换为大写/小写。
rename -f强制覆盖现有文件。

使用 mv 命令重命名文件

mv 是一个 Unix 命令,用于将一个或多个目录或文件从一个位置移动到另一个位置。如果文件名在同一文件系统上,它提供通用的文件重命名。文件的内容会被复制到新位置,然后删除旧文件。使用 mv 命令需要用户对将要移动的文件所在的目录具有写权限。这是因为 mv 命令会修改移动过程中涉及的两个目录(目标和源)的内容。当在同一文件系统上的文件上使用 mv 时,文件的 时间戳不会更新。

在 UNIX 实现中,mv、ln 和 cp 命令被实现为一个程序,使用硬链接的可执行文件,这些文件从 AT&T UNIX 复制而来。行为是从 argv[0] 路径名选择的。这是一种基本方法,通过这种方法,紧密相关的命令被捆绑为一个单元,允许用户描述所需操作的具体过程。

mv 命令的选项

大多数 mv 版本都支持

  • -i: 它指定一个交互式过程,并在覆盖旧文件之前在标准错误上提示。如果从标准输入响应的字符以 'Y' 或 'y' 开头,则会启动移动。
  • -f: 表示强制。在此选项中,强制可以覆盖目标。
    上述选项是 X/Open Portability Guidelines 的一部分,后来成为 SUS 和 POSIX 的基础。每个符合 POSIX 标准的 mv 实现都必须支持它们。

mv 的语法如下

  • 目标可以是一个目录或文件,源可以是一个或多个目录或文件。
  • 如果我们将两个或多个文件指定为源,则目标应为目录。在这种情况下,源文件将被移至目标目录。
  • 如果我们将一个文件指定为源,目标是旧目录,那么该文件将被移至指定目录。
  • 我们需要指定一个文件作为源和一个文件作为目标来重命名任何文件。

例如,要将 myfile1.txt 文件重命名为 myfile2.txt,我们将执行以下命令

使用 mv 命令重命名多个文件

该命令一次只能重命名一个文件,但可以与其他命令(如 find)或在 Bash 的 while 或 for 循环中结合使用,以重命名多个文件。

下面的示例显示了如何使用 Bash for 循环重命名当前目录中的每个文件,方法是修改它们的扩展名

让我们逐步解释代码

  • 第一行建立了一个 for 循环,并从以 .html 扩展名结尾的所有文件列表中重复。
  • 第二行对所有列表项应用,并将文件移动到一个新文件,替换 .php 和 .html。 ${f%>html}.php 部分利用 shell 参数扩展来从文件名中删除 .html 部分。
  • done 表示循环段的完成。

如何使用通配符进行批量重命名?

通配符是表示字符模式的强大符号。它们使我们能够根据特定标准重命名两个或多个文件。例如,通配符 ("*") 匹配任意字符序列。通过合并 mv 命令和通配符,我们可以有效地执行批量重命名任务。

如何根据特定标准重命名文件?

Linux 提供了许多选项来根据特定标准(如文件大小、权限或修改日期)重命名文件。find 命令允许我们查找满足特定条件的文件,并据此重命名它们。

如何重命名位于子目录中的文件?

在子目录中,重命名文件与在当前目录中重命名文件相同。我们可以查找特定目录中的文件并执行重命名任务。

如何撤销文件重命名?

我们有时在重命名文件时可能会出错,或者出于其他原因需要恢复更改。拥有实际文件名的记录或备份非常重要。简单来说,如果我们有备份,我们可以使用 mv 命令将文件恢复到实际名称。如果没有备份,我们可能需要文件恢复工具或依赖版本控制系统。

Rename 命令

有两个 rename 命令版本可用,语法不同。如果你的系统上没有安装它,你可以很容易地使用你发行版的包管理器来安装它。

  • 在 Debian 和 Ubuntu 上安装 rename
  • 在 Fedora 和 CentOS 上安装 rename
  • 在 Arch Linux 上安装 rename

以下是一些更基本的如何实现 rename 命令的示例

  • 使用下划线替换文件名中的空格
  • 将文件名转换为小写
  • 将文件名转换为大写

移动与移除和复制

在相同的文件系统中移动文件与复制文件并删除原始文件基本不同。在不支持 rename syscall 的平台上,会在新目录中添加一个新链接,并删除原始链接。文件数据不会被访问。所有符合 POSIX 标准的系统都执行 rename 调用。

原始移动比复制-移动过程快得多。文件的 i-number 不会改变。只要正在修改目录条目(“移动”的结果),就不需要读取正在移动的文件。由于目标和源目录都将被更改,因此会在目标目录中建立条目,并从源目录中删除条目。

在两个目录中,都需要“写”权限才能完成移动。将文件从一个文件系统移动到另一个文件系统可能会完全失败,或者可能自动执行为原子复制-删除函数。原始详细信息取决于实现。

高级文件重命名方法

Linux 提供了高级的文件重命名方法,提供了更多的自定义和灵活性。这些方法讨论如下

  • 正则表达式用法

正则表达式是强大的模式,允许我们匹配和处理文本。特别是,它们在处理复杂重命名操作时非常有用。包括 SED 或 Rename 在内的许多工具都支持正则表达式,使我们能够执行复杂的文件重命名任务。

  • 使用 bash 脚本

使用 bash 脚本可以自动化重复和复杂的重命名任务过程。我们可以通过合并脚本结构和 Linux 命令来构建符合我们要求的自定义重命名脚本。