由于您对 AWK 不太了解,我可以建议您完全跳过它并切换到 PERL 吗?
但首先要做的事情。你真正想解决什么问题?
在我看来,您获得了文件名列表(DIR/COL=2/OUT=x.x)
您想使用该列表生成重命名,其中版本号最高的文件变为数字 1,下一个变为 2,依此类推。
对吗?
我希望不必担心重叠问题,这可能是由于存在版本限制。
DCL 默认值可以做到这一点。
- 在这里使用 PERL 作为创建一堆文件的便捷方式
- 使用 FILE_ID 显示哪个文件是哪个
就这样吧。
$perl -e "open X,qq(>file.log;$_) for 1997..2000"
$dir/file
FILE.LOG;2000 (59705,105,0)
FILE.LOG;1999 (46771,399,0)
FILE.LOG;1998 (42897,980,0)
FILE.LOG;1997 (24538,519,0)
$rena/log file.log.* tmp.log;
%RENAME-I-RENAMED, FILE.LOG;2000 renamed to TMP.LOG;1
%RENAME-I-RENAMED, FILE.LOG;1999 renamed to TMP.LOG;2
%RENAME-I-RENAMED, FILE.LOG;1998 renamed to TMP.LOG;3
%RENAME-I-RENAMED, FILE.LOG;1997 renamed to TMP.LOG;4
$rena tmp.log;* file.log/log
%RENAME-I-RENAMED, TMP.LOG;4 renamed to FILE.LOG;4
%RENAME-I-RENAMED, TMP.LOG;3 renamed to FILE.LOG;3
%RENAME-I-RENAMED, TMP.LOG;2 renamed to FILE.LOG;2
%RENAME-I-RENAMED, TMP.LOG;1 renamed to FILE.LOG;1
$dir/file file.log;*
FILE.LOG;4 (24538,519,0)
FILE.LOG;3 (42897,980,0)
FILE.LOG;2 (46771,399,0)
FILE.LOG;1 (59705,105,0)
好吗?不需要帮手。只有两个依赖于“;”的命令停止继承的魔法。
现在让我们看看如何直接在 Perl 中执行此操作。
$ dir/file
FILE.LOG;2000 (59705,105,0)
FILE.LOG;1999 (46771,399,0)
FILE.LOG;1998 (42897,980,0)
FILE.LOG;1997 (24538,519,0)
$ perl -e "for (<file.log;*>) {$i++; $old = $_; s/;\d+/;$i/; rename $old, $_}"
$ dir/file
FILE.LOG;4 (24538,522,0)
FILE.LOG;3 (42897,983,0)
FILE.LOG;2 (46771,402,0)
FILE.LOG;1 (59705,108,0)
按步骤分解:
<xxx> = glob("xxx") = glob(qq(xxx) = wildcard lookup with interpolated string.
for (<file.log;*>) # Loop over all files matching pattern, output into $_
{ # code block
$i++; # increment for each iteration. start at 1
$old = $_; # save the fetched file name
s/;\d+/;$i/; # substitute a semicolon followed by numbers
rename $old, $_ # Actual rename. Try with PRINT first.
} # end of code block
好吗?