如何将 splitfile[az] 重命名为 splitfile

如何将 splitfile[az] 重命名为 splitfile

splitfile[a-z]我正在尝试重命名以to形式命名的文件splitfile[1-26].csv,即我想重命名splitfileasplitfile1.csv等等。
我尝试了以下命令:

mv splitfile[a-z] splitfile[1-26].csv 

但它不起作用。请帮助我,同时我正在尝试使用 for 循环。

答案1

对于 new ,bash您可以使用以下形式的大括号扩展{a..z}

i=1; for f in file{a..z}; do mv "$f.csv" "${f%?}$((i++)).csv"; done

答案2

如果您有perl该实用程序rename(有时称为prename),您可以使用它来重命名您的文件

rename -n 's/([a-z])$/ord($1)-96/e and $_ .= ".csv"' splitfile?

其作用是获取文件名匹配的最后一个字母splitfile?,将字符转换为其 ASCII 序数等效项(即 a=97、b=98,...),减去 96 并用结果替换匹配的字母。对于成功应用此替换的所有文件名,都会附加字符串“.csv”。

上面的命令不会更改您的实际文件(这就是该-n标志的作用),它只会打印它会执行的操作。运行一次,检查输出,如果正确,则在不带-n.

答案3

With zshone不需要使用循环,只需使用一个zmv函数:

autoload -U zmv
i=1 zmv -v '(file)[a-z].csv' '$1$((i++)).csv'

或者,如果不是所有的file[a-z].csv都存在:

letters=({a..z})
zmv -v '(file)([a-z]).csv' '$1$letters[(i)$2].csv'

答案4

这是使用 POSIX shell 执行此操作的一种方法,假设所有文件都存在于a-z序列中:

#!/bin/sh
i=1
for f in file[a-z].csv
do
    echo mv $f file$i.csv
    i=$((i+1))
done

相关内容