Linux 如何在bash中使用路径名和重新排序的序列批量重命名多个图像?
“我的图片”保存在文件夹中,文件夹名称为图片日期,例如原始路径和文件名:Linux 如何在bash中使用路径名和重新排序的序列批量重命名多个图像?,linux,bash,rename,batch-processing,mv,Linux,Bash,Rename,Batch Processing,Mv,“我的图片”保存在文件夹中,文件夹名称为图片日期,例如原始路径和文件名: .../Pics/2016_11_13/wedding/DSC0215.jpg .../Pics/2016_11_13/afterparty/DSC0234.jpg .../Pics/2016_11_13/afterparty/DSC0322.jpg 如何将图片重命名为以下格式,使用连续序列和4位填充 .../Pics/2016_11_13_wedding.0001.jpg .../Pics/2016_11_13_aft
.../Pics/2016_11_13/wedding/DSC0215.jpg
.../Pics/2016_11_13/afterparty/DSC0234.jpg
.../Pics/2016_11_13/afterparty/DSC0322.jpg
如何将图片重命名为以下格式,使用连续序列和4位填充
.../Pics/2016_11_13_wedding.0001.jpg
.../Pics/2016_11_13_afterparty.0002.jpg
.../Pics/2016_11_13_afterparty.0003.jpg
我使用的是bash4.1,所以只有mv命令可用。这是我现在拥有的,但它不起作用
#!/bin/bash
p=0
for i in *.jpg;
do
mv "$i" "$dirname.%03d$p.JPG"
((p++))
done
exit 0
比如说你有…/Pics/2016_11_13/widding/XXXXXX.jpg;然后进入目录…/Pics/2016_11_13;从那里,你应该有一系列的子目录,如婚礼,afterparty,等等。启动此脚本(免责声明:我没有测试它):
请注意,我跳过了“日期”(2016年11月13日)部分-我不确定。如果您只有一个日期,那么在#组合新名称中添加这些数字就很容易了。如果有多个日期,则可以为添加嵌套的
,以扫描“日期”目录。我跳过这个的另一个原因是让你自己开发一些东西,一些你可以自豪的东西…只使用mv
和bash内置:
#! /bin/bash
shopt -s globstar
cd Pics
p=1
# recursive glob for .jpg files
for i in **/*.jpg
do
# (date)/(event)/(filename).jpg
if [[ $i =~ (.*)/(.*)/(.*).jpg ]]
then
newname=$(printf "%s_%s.%04d.jpg" "${BASH_REMATCH[@]:1:2}" "$p")
echo mv "$i" "$newname"
((p++))
fi
done
globstar
是bash 4.0的一项功能,即使在OSX的Anitquee bash中也可以使用正则表达式匹配。并且原始序列中存在间隙,因为我删除了一些图片,但最终的图像序列必须是连续的。您编写了任何代码吗?在这里搜索[linux]find xargs mv printf
。你应该找到许多能帮助你解决问题的例子。您需要在知道如何计算占位符的程序中使用%04d
(printf
)。您需要获取命令的输出,并将其替换为实际命令(cmd substation),使用$(printf…)
。祝你好运。那是哪一个呢?红帽还是Git bash?这个问题让人困惑:如果你在redhat上运行,你将在普通bash上运行。如果您在GitBash上运行,这意味着您在windows上运行它。但是您也说“只有mv命令可用”,这是不正确的,在git bashfind
,grep
甚至awk
中都可用。请澄清这些开放性问题
#! /bin/bash
shopt -s globstar
cd Pics
p=1
# recursive glob for .jpg files
for i in **/*.jpg
do
# (date)/(event)/(filename).jpg
if [[ $i =~ (.*)/(.*)/(.*).jpg ]]
then
newname=$(printf "%s_%s.%04d.jpg" "${BASH_REMATCH[@]:1:2}" "$p")
echo mv "$i" "$newname"
((p++))
fi
done