3

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

 2 years ago
source link: https://www.myfreax.com/how-to-rename-files-in-linux/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

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

Published 11 Aug 2019

6 min read

By myfreax
如何在Linu中重命名文件和目录

重命名文件和目录是您经常需要在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版本。如果您的系统上未安装此版本,则可以使用发行版的软件包管理器安装该版本。

在Ubuntu和Debian上安装rename

sudo apt install rename

在CentOS和Fedora上安装prename

sudo yum install prename

在Arch Linux上安装rename

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

Share this article:


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK