我有一些文件:
$ ls
00000.ABC
00001.ABC
00002.ABC
00003.ABC
00004.ABC
00005.ABC
我想将它们更改为以某个数字开头,例如00055.ABC
,以便新文件看起来像:
$ ls
00055.ABC
00056.ABC
00057.ABC
00058.ABC
00059.ABC
00060.ABC
我了解for循环遍历每个文件,例如for file in ls { }
,但是我不确定以某个数字开头的递增数字,因此不胜感激。
答案 0 :(得分:1)
这应该有效:
for f in *.ABC; do
num=$(basename "$f" .ABC)
num2=$(printf "%05d" $((num + 55)))
echo mv "$f" "$num2.ABC"
done
注意:
我假设您的文件都遵循数字模式,后跟.ABC
,以便basename $f .ABC
提取数字。如果此假设不成立,则必须调整num=
行。
$(( ... ))
是进行算术运算的bash
语法。
(printf "%05d" ...)
在这里在数字前面填充零,否则您将得到55
等。
一旦确信自己做对了,请删除echo
。
编辑警告:新的文件名集不应与旧的文件名集重叠,否则您可能会丢失一些文件。仔细选择mv
命令的运行顺序可以解决此问题,但是在文件重命名时将其放置在新目录中,然后再将其移回将更简单。
编辑:
@MarkSetchell在注释中指出,您想要不基于原始文件名的顺序编号,在这种情况下,此循环将起作用:
i=55 # choose your starting destination file number here
for f in *.ABC; do
dest=$(printf "%05d" $i).ABC
echo mv "$f" "$dest"
i=$((i + 1))
done
答案 1 :(得分:1)
您可以使用rename
轻松地做到这一点,它实际上只是一个Perl脚本,可以通过 homebrew 使用 macOS 安装: >
brew install rename
该命令将是:
rename --dry-run -XN "00055" -e '$_ = $N' *ABC
示例输出
'00001.ABC' would be renamed to '00055.ABC'
'00002.ABC' would be renamed to '00056.ABC'
'00003.ABC' would be renamed to '00057.ABC'
'00004.ABC' would be renamed to '00058.ABC'
'00005.ABC' would be renamed to '00059.ABC'
如果看起来正确,则可以删除--dry-run
,然后再次执行。使用rename
的好处是它不会破坏(覆盖)文件,并且如果您使用--dry-run
选项,它将告诉您它将要做什么,而无需实际更改任何内容。它也非常强大-可以执行小写,驼峰,大写,删除控制字符,调用任何Perl模块并计算您可以想到的任何表达式或替换。