在命令行中重命名多个目录

Rts*_*e42 6 directory rename batch

我有一些文件夹叫做:

Session 1
Session 2
Session 3
Session 4
Session 5
Session 6
Session 7
Session 8
Run Code Online (Sandbox Code Playgroud)

我想将它们全部重命名为:

Folder 1
Folder 2
Folder 3
Folder 4
Folder 5
Folder 6
Folder 7
Folder 8
Run Code Online (Sandbox Code Playgroud)

我将如何以最有效的方式在终端中执行此操作?

我知道mmv mvrename,但不知道我应该用什么以及如何去做。

Ser*_*nyy 16

前名

最简单的方法是使用renameor prename,它是一个 Perl 脚本(如果你是一个kshmksh用户,那个 shell 有rename内置函数,这是不同的,所以为了一致性,我会prename在提到那个 Perl 时使用脚本;或者您可以调用/usr/bin/rename- 可执行文件的完整路径)。

$ ls
Session 1/  Session 2/  Session 3/  Session 4/  Session 5/  Session 6/  Session 7/  Session 8/
$ prename 's/Session/Folder/' Session*/                                                                                  
$ ls
Folder 1/  Folder 2/  Folder 3/  Folder 4/  Folder 5/  Folder 6/  Folder 7/  Folder 8/
Run Code Online (Sandbox Code Playgroud)

如果您需要递归搜索或确保找到正确类型的项目(也许您的文件名中还有带有“Session”字样的文件),您可以将其与find实用程序结合使用:

$ ls
Folder 1/  Folder 2/  Folder 3/  Folder 4/  Folder 5/  Folder 6/  Folder 7/  Folder 8/

$ find -maxdepth 1 -type d -name "Session *" -exec prename 's/Session/Folder/' {} \;                                      

$ ls
Folder 1/  Folder 2/  Folder 3/  Folder 4/  Folder 5/  Folder 6/  Folder 7/  Folder 8/
Run Code Online (Sandbox Code Playgroud)

有点冗长,可能有点多余,但有效。

MV

一个小问题mv是我们每次都需要更改目的地的名称,所以它本身不能做我们想要的。为此,我们必须将其与其他一些工具(例如findbash的工具)结合使用。

$ ls
Session 1/  Session 2/  Session 3/  Session 4/  Session 5/  Session 6/  Session 7/  Session 8/


$ for dir in Session*/ ; do mv "${dir}" "Folder ${dir##*\ }" ;done                                                       

$ ls
Folder 1/  Folder 2/  Folder 3/  Folder 4/  Folder 5/  Folder 6/  Folder 7/  Folder 8/
Run Code Online (Sandbox Code Playgroud)

你在这里看到的是,我们正在循环所有包含单词的项目Session并且是目录。我们使用参数扩展`${dir##*\ }" 提取目录名称中空格后的所有内容(即相应的数字),并形成新的字符串“文件夹/”。

在这两个prename命令中,mv我们都使用了 globbing,这意味着这些方法将重命名每个包含“Session”一词的目录,甚至“Session blah”。当然,这并不理想,但对于您知道文件夹命名一致的特定情况,这会起作用。或者,我们可以使用for dir in Session\ [1-9] ; do . . .done.

换句话说,这种方法可以工作,但非常简单,并不是最好的。

Python

当然,也可以使用其他工具。例如,Python:

$ ls
Session 1/  Session 3/  Session 5/  Session 7/
Session 2/  Session 4/  Session 6/  Session 8/

$ python -c 'import os,shutil;map(lambda x:shutil.move(x,x.replace("Session","Folder")),os.listdir("."))'                

$ ls
Folder 1/  Folder 2/  Folder 3/  Folder 4/  Folder 5/  Folder 6/  Folder 7/  Folder 8/
Run Code Online (Sandbox Code Playgroud)