Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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
使用shell将图像重命名为有序序列_Shell - Fatal编程技术网

使用shell将图像重命名为有序序列

使用shell将图像重命名为有序序列,shell,Shell,我有一堆文件夹,其中包含按顺序排列但不按顺序排列的图像,如下所示: /root /f1 img21.jpg img24.jpg img26.jpg img27.jpg /f2 img06.jpg img14.jpg img36.jpg img57.jpg let i=0 ls *.jpg | while read file; do mv $file prefix_$(printf "%02d" $i).jpg

我有一堆文件夹,其中包含按顺序排列但不按顺序排列的图像,如下所示:

/root /f1 img21.jpg img24.jpg img26.jpg img27.jpg /f2 img06.jpg img14.jpg img36.jpg img57.jpg
let i=0
ls *.jpg | while read file; do
    mv $file prefix_$(printf "%02d" $i).jpg
    let i++
done
/根 /f1 img21.jpg img24.jpg img26.jpg img27.jpg /f2 img06.jpg img14.jpg img36.jpg img57.jpg 我想让它们看起来像这样,有文件夹标题,也有顺序排列的所有图像:

/root /f1 f1_01.jpg f1_02.jpg f1_03.jpg f1_04.jpg /f2 f2_01.jpg f2_02.jpg f2_03.jpg f2_04.jpg /根 /f1 f1_01.jpg f1_02.jpg f1_03.jpg f1_04.jpg /f2 f2_01.jpg f2_02.jpg f2_03.jpg f2_04.jpg 我不知道如何使用shell脚本来实现这一点


提前谢谢

在目录中,
ls
将按词法顺序为您提供文件,从而获得正确的排序。所以你可以这样做:

/root /f1 img21.jpg img24.jpg img26.jpg img27.jpg /f2 img06.jpg img14.jpg img36.jpg img57.jpg
let i=0
ls *.jpg | while read file; do
    mv $file prefix_$(printf "%02d" $i).jpg
    let i++
done
这将获取所有
*.jpg
文件,并以
前缀\u 00.jpg
前缀\u 01.jpg
等开头重命名它们


这显然只适用于一个目录,但希望通过一点工作,您可以使用它来构建一些可以做您想要做的事情。

在一个目录中,
ls
将按词法顺序为您提供文件,从而获得正确的排序。所以你可以这样做:

/root /f1 img21.jpg img24.jpg img26.jpg img27.jpg /f2 img06.jpg img14.jpg img36.jpg img57.jpg
let i=0
ls *.jpg | while read file; do
    mv $file prefix_$(printf "%02d" $i).jpg
    let i++
done
这将获取所有
*.jpg
文件,并以
前缀\u 00.jpg
前缀\u 01.jpg
等开头重命名它们


这显然只适用于一个目录,但希望通过一点工作,您可以使用它来构建一些您想要的东西。

使用
for
循环来迭代目录,使用另一个
for
循环来迭代文件。为每个文件维护一个递增1的计数器

没有直接方便的方法用前导零填充数字。您可以调用
printf
,但这有点慢。一个有用的快速技巧是从101开始计数(如果你想要两位数的数字,那么从1000开始,如果你想要三位数的数字,等等),然后去掉前面的1

cd /root
for d in */; do
  i=100
  for f in "$d/"*; do
    mv -- "$f" "$d/${d%/}_${i#1}.${f##*.}"
    i=$(($i+1))
  done
done
${d%/}
$d
结尾处剥离
/
${i#1}
$i
${f#*.}
开头处剥离
$f
中除最后一个
/code>之外的所有内容。这些构造在shell手册中有关参数扩展的部分中有文档记录


请注意,此脚本假定目标文件名不会与现有文件名冲突。如果您有一个名为
img
的目录,某些文件将被覆盖。如果这可能是一个问题,最简单的方法是首先将所有文件移到另一个目录,然后在重命名它们时将它们移回原始目录。

使用
for
循环迭代目录,使用另一个
for
循环迭代文件。为每个文件维护一个递增1的计数器

没有直接方便的方法用前导零填充数字。您可以调用
printf
,但这有点慢。一个有用的快速技巧是从101开始计数(如果你想要两位数的数字,那么从1000开始,如果你想要三位数的数字,等等),然后去掉前面的1

cd /root
for d in */; do
  i=100
  for f in "$d/"*; do
    mv -- "$f" "$d/${d%/}_${i#1}.${f##*.}"
    i=$(($i+1))
  done
done
${d%/}
$d
结尾处剥离
/
${i#1}
$i
${f#*.}
开头处剥离
$f
中除最后一个
/code>之外的所有内容。这些构造在shell手册中有关参数扩展的部分中有文档记录


请注意,此脚本假定目标文件名不会与现有文件名冲突。如果您有一个名为
img
的目录,某些文件将被覆盖。如果这可能是一个问题,最简单的方法是首先将所有文件移到另一个目录,然后在重命名它们时将它们移回原始目录。

在这里调用
ls
没有意义<读取文件时代码>ls*.jpg |
是在*.jpg中为文件编写
的一种复杂且不完整的方法。看,我不确定它是复杂的还是坏的。当然,这是不同的,但它将导致正确的行为,特别是对于OP示例输入<读取文件时代码>ls*.jpg |
是在*.jpg中为文件编写
的一种复杂且不完整的方法。看,我不确定它是复杂的还是坏的。当然,这是不同的,但它将导致正确的行为,特别是对于OP示例输入。