重命名文件和目录是您经常需要在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的for或while循环中重命名多个文件。
在以下示例中显示如何使用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/' *
结论
至此您应该很好地理解如何使用mv
和rename
命令重命名文件。当然,还有其他命令可以在Linux中重命名文件,例如mmv
。对于新Linux用户可以使用GUI批量重命名工具,例如Métamorphose。