splitfile[a-z]
我正在尝试重命名以to形式命名的文件splitfile[1-26].csv
,即我想重命名splitfilea
为splitfile1.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 zsh
one不需要使用循环,只需使用一个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