我有一个包含超过10万个小文件的目录。 我想将它们放在不同的文件夹中。
find mydir/ -type f | sort > tt.txt
vim tt.txt
现在我想为每一行插入一个带有这个公式的数字:
(行号)+ 50000 +((行号/ 1000)* 1000)
所以原始文件是这样的:
abainville_55130_55001.htm
abancourt_59268_59001.htm
abbenans_25340_25003.htm
abergement-de-cuisery_71290_71001.htm
应输出:
51001 - abainville_55130_55001.htm
51002 - abancourt_59268_59001.htm
51003 - abbenans_25340_25003.htm
51004 - abergement-de-cuisery_71290_71001.htm
依此类推,直到第1000行
line 998 => 51000 - bannes_53340_53019.htm
line 999 => 51000 - bannieres_81500_81022.htm
line 1000 => 52000 - bannoncourt_55300_55027.htm
line 1001 => 52000 - banos_40500_40024.htm
line 1002 => 52000 - bans_39380_39037.htm
然后我将应用一个宏将其转换为:
mv bannes_53340_53019.htm 51998/bannes_53340_53019.htm
mv bannieres_81500_81022.htm 51999/bannieres_81500_81022.htm
mv bannoncourt_55300_55027.htm 52000/bannoncourt_55300_55027.htm
mv banos_40500_40024.htm 52001/banos_40500_40024.htm
mv bans_39380_39037.htm 52002/bans_39380_39037.htm
(最后一部分很简单,不是问题,问题与数学有关)。
我知道有类似但我无法找到应用我的数学的解决方案:
:s/^/\=(line('.')+51000)/
答案 0 :(得分:1)
你快到了。您可以使用以下命令:
:%s/^/\=line('.')+51000 . " - "/
其中%
将其应用于整个文件,.
执行字符串连接以获取间隔连字符。
修改强>
为了将/
用作表达式的一部分,您可以更改分隔符(请参阅:help E146
)。例如,以下为1000行生成51000,然后为接下来的1000行生成52000,依此类推:
:s!^!\=50000 + (line('.') / 1000) * 1000 . " - "!
答案 1 :(得分:1)
您不必分两步完成这项工作,如果您想坚持使用vim,可以在一个简短的时间内使用vim生成"mv..."
命令行。
试试这一行:
%s#.*$#\="mv ".submatch(0)." ".(line(".")+50000+((line(".")/1000)*1000)) . "/" . submatch(0)#
将生成如下内容:(if the first line is on line number 1
)
mv abainville_55130_55001.htm 50001/abainville_55130_55001.htm
mv abancourt_59268_59001.htm 50002/abancourt_59268_59001.htm
mv abbenans_25340_25003.htm 50003/abbenans_25340_25003.htm
mv abergement-de-cuisery_71290_71001.htm 50004/abergement-de-cuisery_71290_71001.htm