myfreax

Linux 重命名文件和目录

重命名文件和目录是您经常需要在Linux系统上执行的最基本任务之一。重命名单个文件很简单,但一次重命名多个文件可能是一个挑战

6 min read
By myfreax
Linux 重命名文件和目录

重命名文件和目录是您经常需要在Linux系统上执行的最基本任务之一。重命名单个文件很简单,但一次重命名多个文件可能是一个挑战。

特别是对于刚接触Linux的用户而言。您可以使用GUI文件管理器或命令行终端重命名文件。

mv命令重命名文件

mv命令用于将文件从一个位置重命名或移动到另一个位置。这是mv命令的基本语法mv [OPTIONS] source destination

source源可以是一个或多个文件或目录,destination目标可以是单个文件或目录。

如果指定多个文件作为源source,则destination目标必须是目录。在这种情况下,源文件将移动到目标目录。

如果将单个文件指定为源source,并且目标是目录,则该文件将移动到指定目录。

要重命名文件,您需要将单个文件指定为源source,并将单个文件指定为目标destination。例如,以下mv命令将file1.txt重命名为file2.txt

mv file1.txt file2.txt

mv命令重命名多个文件

mv命令一次只能重命名一个文件,但它可以与其他命令一起使用,例如find命令在bash的forwhile循环中重命名多个文件。

在以下示例中显示如何使用Bash for循环将重命名当前目录中的所有.html文件。并将.html扩展名更改为.php

for f in *.html; do 
    mv -- "$f" "${f%.html}.php"
done

让我们解释一下语句的含义,最容易理解当然是最后的一行是shell/bash的关键词done表示循环的结束。

第一行创建一个for循环并遍历当前目录下以.html文件扩展名的文件。第二行将.html文件移动并重命名文件。

并将文件的.html扩展名替换为.php${f%.html}使用的是shell参数扩展,.html将会匹配文件名原来扩展名,匹配的.html将会被删除。

从示例中可以看出,使用mv命令重命名多个文件并不是一件容易的事,因为它需要你很好地了解Bash脚本编程。

mv命令除了可以和shell脚本的for循环整合之外。我们还可以让mv结合find命令来实现与上面相同的功能。

我们还可以使用find命令搜索/查找当前目录下以.html结尾的文件。然后使用-exec对每个文件运行指定命令。

-exec允许你指定要运行的命令,find命令将搜索的每个结果一个接一个传递-exec要运行的命令中。

你可在-exec运行的命令使用字符串{}获得正在处理的文件,如果你在使用find命令搜索文件使用绝对路径,字符串{}将是一个文件的绝对路径。

find . -depth -name "*.html" -exec sh -c 'f="{}"; mv -- "$f" "${f%.html}.php"' \;

这里我们解释一下上面的find和-exec,mv是怎么配合使用的。

find命令之后.表示当前目录,find的-depth选项表示递归当前目录下的所有目录,-name选项表示要使用名称进行搜索。

"*.html"之所以加上双引号是防止*号被shell解释,*.html表示以.html作为扩展名的文件。

-exec sh -c表示-exec要运行命令是sh -c。在类 Unix 操作系统上,sh是Bourne shell名名称,是Unix和许多类Unix操作系统/Linux的标准命令语言解释器。-c是sh选项表示读取命令字符串并运行。

'f="{}"; mv -- "$f" "${f%.html}.php"'这是一个命令的字符串,我想你应该知道大概含义,我们这里简单说一下。f="{}"表示将{}赋值给变量f{} 是文件名。

最后'f="{}"; mv -- "$f" "${f%.html}.php"' 这个命令字符串将由sh来解释并运行。分号;结束exec执行的命令。它需要用\进行转义,这样你在里面运行的shell 就不会把它当作自己的特殊字符,而是将它传递给find。

rename命令重命名文件

rename用于重命名多个文件。rename命令相比mv,你需要一些正则表达式的高级知识。

rename命令有两个版本,语法不同。在本教程中,我们将使用rename命令的perl版本。如果您的系统上未安装此版本,则可以使用发行版的软件包管理器安装该版本。

如果你的计算机运行的是基于Debian的Linux发行版,例如Ubuntu,Linux mint。可运行命令sudo apt update && sudo apt install rename安装rename。

对于基于Redhat的Linux发行版,例如CentOS,Fedora。可运行命令sudo apt update && sudo apt install rename安装rename。

Arch Linux用户可运行命令yay perl-rename或者yaourt -S perl-rename安装rename。

sudo apt update && sudo apt install rename
sudo yum install prename
yay perl-rename ## or yaourt -S perl-rename

rename命令的语法是rename [OPTIONS] perlexpr files。files表示多个文件,perlexpr是使用perl的正则表达式。

rename命令将多个文件根据指定的正则表达式重命名所有文件。你可以在这里阅读更多关于Perl的正则表达式的知识。

perl的正则表达式基本语法是action/SEARCHLIST/REPLACEMENTLIST/cdsr。在重命名文件的perl正则表达式中常用的s///替换模式。

action 表示你要执行操作,SEARCHLIST表示你要搜索的内容,REPLACEMENTLIST表示你要REPLACEMENTLIST 替换SEARCHLIST

在使用rename重命名文件时,您还可以使用-n参数在不真实的运行reanme命令尝试打印要重命名的文件的名称。这将不会不重命名你的文件,可以用来做简单的测试。

默认情况下,rename命令不会覆盖现有文件。传递-f参数以允许覆盖现有文件。

例如,下面的rename命令将更改与扩展名.html.php

rename 's/.html/.php/' *.html
rename -f 's/.html/.php/' *.html #覆盖现有文件
rename -n 's/.html/.php/' *.html #尝试运行,用于测试

输出看起来像这样:

rename(file-90.html, file-90.php)
rename(file-91.html, file-91.php)
rename(file-92.html, file-92.php)
rename(file-93.html, file-93.php)
rename(file-94.html, file-94.php)

以下是一些如何使用rename命令的常见示例。

用下划线替换文件名中的空格

rename 'y/ /_/' *

将文件名转换为小写

rename 'y/A-Z/a-z/' *

将文件名转换为大写

rename 'y/a-z/A-Z/' *

结论

至此您应该很好地理解如何使用mvrename命令重命名文件。当然,还有其他命令可以在Linux中重命名文件,例如mmv。对于新Linux用户可以使用GUI批量重命名工具,例如Métamorphose