RegEx移动并更改文件名

时间:2012-08-10 15:11:43

标签: regex bash

我正在尝试在此目录和格式中移动大量文件:

/1.12.268/1.12.268_Hi_3D.jpg

到此目录和格式:

/1.12.0268/1.12.0268_Hi_3D.jpg

我设法运行一个为我创建所有新文件夹的RegEx:

ls 1* | find . -type d | awk '{print("mkdir "$1)}' | sed 's/[0-9][0-9][0-9]*/0&/2'

但是我无法弄清楚用什么正则表达式创建一个mv语句来移动并将所有文件重命名为新文件夹?

这和我一样接近,但文件夹相反,文件没有重命名。

ls 1* | find . -type f | awk '{print("mv "$1" "$1)}' | sed 's/[0-9][0-9][0-9]*/0&/2'

我得到了这个输出:

mv ./1.12.0269/1.12.269_Low_Tech.gif ./1.12.269/1.12.269_Low_Tech.gif
mv ./1.14.0410/1.14.410_hi_3d.jpg ./1.14.410/1.14.410_hi_3d.jpg
mv ./1.14.0410/1.14.410_hi_tech.jpg ./1.14.410/1.14.410_hi_tech.jpg
mv ./1.14.0410/1.14.410_low_3d.png ./1.14.410/1.14.410_low_3d.png
mv ./1.14.0410/1.14.410_low_tech.png ./1.14.410/1.14.410_low_tech.png
mv ./1.14.0845/1.14.845_hi_3d.jpg ./1.14.845/1.14.845_hi_3d.jpg
mv ./1.14.0845/1.14.845_hi_tech.jpg ./1.14.845/1.14.845_hi_tech.jpg
mv ./1.14.0845/1.14.845_low_3d.png ./1.14.845/1.14.845_low_3d.png
mv ./1.14.0845/1.14.845_low_tech.png ./1.14.845/1.14.845_low_tech.png

当我实际上想要这个时:

mv ./1.12.269/1.12.269_Low_Tech.gif ./1.12.0269/1.12.0269_Low_Tech.gif
mv ./1.14.410/1.14.410_hi_3d.jpg ./1.14.0410/1.14.0410_hi_3d.jpg
mv ./1.14.410/1.14.410_hi_tech.jpg ./1.14.0410/1.14.0410_hi_tech.jpg
mv ./1.14.410/1.14.410_low_3d.png ./1.14.0410/1.14.0410_low_3d.png
mv ./1.14.410/1.14.410_low_tech.png ./1.14.0410/1.14.0410_low_tech.png
mv ./1.14.845/1.14.845_hi_3d.jpg ./1.14.0845/1.14.0845_hi_3d.jpg
mv ./1.14.845/1.14.845_hi_tech.jpg ./1.14.0845/1.14.0845_hi_tech.jpg
mv ./1.14.845/1.14.845_low_3d.png ./1.14.0845/1.14.0845_low_3d.png
mv ./1.14.845/1.14.845_low_tech.png ./1.14.0845/1.14.0845_low_tech.png

任何帮助都非常感谢!

2 个答案:

答案 0 :(得分:1)

使用rename选项吗?它基本上是为这种东西制作的。

如果是这样,rename -n 's/[0-9][0-9][0-9]/0$&/g'应该适合您。 (-n仅用于调试,删除它以进行实际重命名。)

答案 1 :(得分:1)

我有肮脏的方式来做这件事。试一试。

ls 1* | find . -type f | awk '{print("mv "$1" "$1)}' | sed 's/[0-9][0-9][0-9]*/0&/6' | sed 's/[0-9][0-9][0-9]*/0&/8'