我的桌面上有一个名为 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
进入每个可用目录,重置计数器,循环遍历所有目标文件,递增每个目录的计数器,然后进行重命名。