我想重新排列和重命名文件。 我有这种文件树结构:
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
答案 0 :(得分:1)
您可以使用basename
和dirname
函数重建新文件名:
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"
}
e.g。 get_new_name("ada/rda/0.05/alpha1_freeSurface.md")
会在控制台中显示ada/rda/ada-0.05-alpha1.md
。
然后,您可以遍历所有文件并使用mv
命令重命名文件。
答案 1 :(得分:1)
使用perl rename
(有时称为prename
)实用程序:
rename 's|ada/rda/([^/]*)/([^_]*).*|ada/rda/ada-$1-$2.md|' ada/rda/*/*
(注意:默认情况下,某些发行版会从rename
软件包安装util-linux
命令。此命令不兼容。如果您有这样的分发,请查看是否perl版本名称为prename
。)
rename
将perl命令作为参数。这里的参数由一个替换命令组成。通过将substitute命令应用于旧名称,可以找到该文件的新名称。这使我们不仅可以为文件指定一个新名称,还可以为上面的新目录。
更详细地说,substitute命令看起来像s|old|new|
。在我们的例子中,old
是ada/rda/([^/]*)/([^_]*).*
。这将捕获组1中的数字和组2中文件名的开头(第一个_
之前的部分)。new
部分为ada/rda/ada-$1-$2.md
。这将使用两个捕获的组创建新文件名。