我有一些文件夹名为:
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
mv
,rename
但不确定我应该使用什么以及如何使用。
答案1
前缀
最简单的方法是使用rename
或prename
,它是一个 Perl 脚本(如果您是ksh
或mksh
用户,该 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
是我们每次都需要更改目的地的名称,因此它本身无法满足我们的要求。要做到这一点,我们必须将它与其他一些工具(例如find
或bash
的工具)结合起来。
$ 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\'