用于重命名和重新排列文件的脚本shell

我想重新排列和重命名文件。 我有这个树形结构的文件:

ada/rda/0.05/alpha1_freeSurface.md ada/rda/0.05/p_freeSurface.md ada/rda/0.05/U_freeSurface.md ada/rda/0.1/alpha1_freeSurface.md ada/rda/0.1/p_freeSurface.md ada/rda/0.1/U_freeSurface.md 

我希望文件将被重新命名和重新排列,如下所示:

 ada/rda/ada-0.05-alpha1.md ada/rda/ada-0.05-p.md ada/rda/ada-0.05-U.md ada/rda/ada-0.1-alpha1.md ada/rda/ada-0.1-p.md ada/rda/ada-0.1-U.md 

使用perl rename (有时称为prename )实用程序:

 rename 's|ada/rda/([^/]*)/([^_]*).*|ada/rda/ada-$1-$2.md|' ada/rda/*/* 

(注意:默认情况下,一些发行版在util-linux软件包中安装了rename命令,这个命令是不兼容的 ,如果你有这样一个发行版,请查看perl版本是否可用。

怎么运行的

rename需要一个perl命令作为参数。 这里的参数由一个替代命令组成。 该文件的新名称可以通过将substitute命令应用于旧名称来找到。 这使我们不仅可以给文件一个新的名字,而且还可以像上面那样创建一个新的目录。

更详细地说,替代命令看起来像s|old|new| 。 在我们的例子中, oldada/rda/([^/]*)/([^_]*).* 。 这将捕获组1中的数字和组2中的文件名(第一个_之前的部分)的开头。 new部分是ada/rda/ada-$1-$2.md 这将使用两个捕获的组创建新的文件名。

您可以使用basenamedirname函数来重建新的文件名:

 get_new_name() { oldname=$1 prefix=$(basename $oldname _freeSurface.md) dname=$(dirname $oldname) basedir=$(dirname $dname) dname=$(basename $dname) echo "$basedir/ada-$dname-$prefix.md" } 

例如get_new_name("ada/rda/0.05/alpha1_freeSurface.md")将在控制台中显示ada/rda/ada-0.05-alpha1.md

然后,您可以遍历所有文件,并使用mv命令重命名文件。