1

我有一个包含超过 100 000 个小文件的目录。我想将它们放入单独的文件夹中。

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)/
4

2 回答 2

1

你快到了。您可以使用以下命令:

:%s/^/\=line('.')+51000 . " - "/

where%将其应用于整个文件并.进行字符串连接以获得间隔连字符。

编辑:

为了/用作表达式的一部分,您可以更改分隔符(请参阅:help E146)。例如,以下为 1000 行生成 51000,然后为接下来的 1000 行生成 52000,依此类推:

:s!^!\=50000 + (line('.') / 1000) * 1000 . " - "!
于 2013-03-17T10:30:38.330 回答
1

你不必分两步完成这项工作"mv...",如果你想坚持使用 vim,你可以用 vim 生成这些命令行。

试试这一行:

%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
于 2013-03-17T15:21:52.043 回答