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

2 つのステップでジョブを実行する必要はありません"mv..."。vim に固執する場合は、vim を使用してこれらのコマンド ラインを 1 つの短いステップで生成できます。

この行を試してください:

%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 に答える