Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何在bash中使用路径名和重新排序的序列批量重命名多个图像?_Linux_Bash_Rename_Batch Processing_Mv - Fatal编程技术网

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 bash
find
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