![重命名文件-需要正则表达式](https://linux22.com/image/492527/%E9%87%8D%E5%91%BD%E5%90%8D%E6%96%87%E4%BB%B6-%E9%9C%80%E8%A6%81%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.png)
我有 640 个以下格式的文件
string02_01.ext, string02_02.ext, string02_03.ext ...
我需要重命名所有这些项目,以便每 40 个项目改变一次模式,例如
first 40s: a0b0c0.ext, a1b0c0.ext, a2b0c0.ext ...
second 40s: a0b1c0.ext, a1b1c0.ext, a2b1c0.ext ...
third 40s: a0b2c0.ext, a1b2c0.ext, a2b2c0.ext ...
fourth 40s: a0b3c0.ext, a1b3c0.ext, a2b3c0.ext ...
有什么好办法可以做到这一点?任何想法都将不胜感激。
提前致谢
答案1
您不需要为此使用正则表达式,而需要一个常规的 shell 脚本来根据需要迭代文件。假设您希望将第 40 个文件命名为a39b0c0.ext
,则类似以下 shell 脚本的程序应该可以解决问题:
a=0
b=0
c=0
for f in string02_*.ext; do # Assuming that you're running this in the directory with the files
if [ "$a" = "40" ]; then
a=0
b=$(($b + 1))
fi
if [ "$b" = "40" ]; then
b=0
c=$(($c + 1))
fi
mv $f a${a}b${b}c${c}.ext
a=$(($a + 1))
done
答案2
我期望你的 640 个文件名是这样组织的,
第 1 行:a0b0c0.ext a1b0c0.ext ... a39b0c0.ext 第 2 行:a0b1c0.ext a1b1c0.ext ... a39b1c0.ext ... 第 16 行:a0b15c0.ext a1b15c0.ext ... a39b15c0.ext
假设您有一个包含 640 个文件的列表(每行一个),
按照您希望重命名的顺序排序。
(可以使用以下命令完成)。
cd /directory/containint/the/files
find . -name string02_*.ext > files.lst
# maybe you'll run a 'sort' pipe to get files.lst ordered as you want.
请注意,您的 640 个文件不能采用这种形式string02_nn.ext
,
它们可能是“string02_nnn.ext”,然后......
没关系,因为我们使用上述方案。
重命名的 bash 脚本应如下所示,
#!/bin/bash
i=0;
j=0;
k=0;
for f in $(<files.lst)
do
mv $f a${k}b${j}c0.ext # rename happens here
if (( $i % 40 == 0 )); then
j=$(($j + 1));
k=0;
else
k=$(($k + 1));
fi
i=$(($i + 1));
done
答案3
不确定它是否完全满足您的需求,但请查看 mmv。它可以进行批量重命名,例如:
file1.txt
file2.txt
file3.txt
mmv "file*.txt" "#1_file.txt"
1_file.txt
2_file.txt
3_file.txt
如果您使用类似 Debian 的发行版,只需 apt-get mmv。