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

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

我有一些文件夹名为:

Session 1
Session 2
Session 3
Session 4
Session 5
Session 6
Session 7
Session 8

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

Folder 1
Folder 2
Folder 3
Folder 4
Folder 5
Folder 6
Folder 7
Folder 8

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

我知道mmv mvrename但不确定我应该使用什么以及如何使用。

答案1

前缀

最简单的方法是使用renameprename,它是一个 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/

如果您需要递归搜索或确保找到正确类型的项目(也许您的文件名中也包含单词“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/

稍微有点冗长,也许有点多余,但是有效。

动量

的小问题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/

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

在这两个prename命令中,mv我们都使用了通配符,这意味着这些方法将重命名每一个目录中包含单词“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/

答案2

转到包含要重命名的所有文件夹的文件夹并执行以下操作:

find . * | rename 's\Session\Folder\'

相关内容