将子目录中的多个文件重命名为其目录名

将子目录中的多个文件重命名为其目录名

我的桌面上有一个名为 Models 的文件夹。在该文件夹中,有一些命名文件夹,其中包含不带 .jpg 扩展名的 jpeg 文件。 jpeg 文件名是随机哈希值。我想使用 bash 脚本以增量方式将这些 jpeg 文件批量重命名为其目录名称,并在每个文件上附加 .jpg 扩展名。

基本上是这样的

楷模/

 Alice/
      a5ccB2ff3e
      ee420bc4a
      2acee54dc
      ...
 Alex/
      de33fa24c0
      d1eaa48e0a
      ...

我想成为这样的人

楷模/

 Alice/
      Alice001.jpg
      Alice002.jpg
      Alice003.jpg
      ...

 Alex/
      Alex001.jpg
      Alex002.jpg
      ...

答案1

根据你的问题的描述我假设总数一个文件夹内的文件数不超过999个。

这是一个简单的 bash 脚本,在您的顶级目录(即模型)中运行它:

#!/bin/bash
for i in ./*
do
if [ -d "$i" ]
then
j=001
for k in "$i"/*
do
mv "$k" "$i"/"$i""$j".jpg
j=${j#0}
if [ ${j:0:1} -eq 0 ]
then 
j=${j#0}
fi
(( j++ ))
j=`printf '%03i' $j`
done
fi
done

它会首先检查 Models 中的每个文件,无论它是否是目录if [ -d "$i" ]。然后对于该目录中的每个文件,它都会将其名称更改为mv "$k" "$i"/"$i""$j".jpg.和

j=${j#0}
if [ ${j:0:1} -eq 0 ]
then 
j=${j#0}
fi

上面的代码将从头开始删除所有零,这样您就不会收到如下错误:

 ((: 008: value too great for base (error token is "008")
 printf: 008: invalid octal number

j=`printf '%03i' $j`

将使值j长度为 3 位。

答案2

也可以尝试一下 Debian_yadav 提案的简化版本:

for i in *
  do    if [ -d "$i" ] && cd "$i"
          then  j=0
                for k in *
                  do    ((j++))
                        echo mv "$k" $(printf "%s%03d.jpg" $i $j )
                  done
                cd ..
          fi
  done

echo用于调试;如果对所看到的内容感到满意,请删除。

cd进入每个可用目录,重置计数器,循环遍历所有目标文件,递增每个目录的计数器,然后进行重命名。

相关内容