重命名文件-需要正则表达式

重命名文件-需要正则表达式

我有 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。

相关内容