-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathREADME
90 lines (65 loc) · 5.84 KB
/
README
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
This module provides a UNIX-like command `diroctopus'.
Copyright (c) 2019-2023 Toshiyuki SHIMONO. All rights reserved.
This program is free software; you can redistribute it and/or
modify it under the same terms as Perl itself.
📁📂 概要 📂📁
このモジュールをインストールすると、コマンド diroctopus が使えるようになる。
あるディレクトリの下に入れ子状に多数の子や孫のディレクトリがある場合、どのような
ディレクトリがあるのか把握したくても難しい。その場合、そのような木構造から
代表的なディレトリを具体例として一部切り出して、その名前やそれが持つファイルの
個数から「木全体の性質をある程度把握する」ことを試みるのがこのコマンドである。
蛸(タコ;octopus)の多数の動き回る脚を眺めるようなイメージから
directory + octopus を組み合わせて、diroctopus というコマンド名にした。
📁📂 実行例 📂📁
あるディリクトリで、diroctopus を実行すると、下記のようになる。
Distance Directory_path File_number File_bytesize_sum
5/5 blib/arch/auto/App/diroctopus/ 1 0
5/5 .git/logs/refs/remotes/origin/ 1 460
4/5 blib/lib/auto/App/diroctopus/ 1 0
3/4 .git/refs/remotes/origin/ 1 41
2/3 .git/objects/61/ 1 1228
1/3 .git/objects/fc/ 2 336
1/2 blib/script/ 2 12302
1/3 .git/objects/93/ 1 518
1/3 .git/objects/pack/ 0 0
1/3 .git/objects/ad/ 1 119
1/3 .git/objects/a6/ 1 288
1/3 .git/objects/75/ 1 93
最初の行の出力は、表頭であり、4列のテーブルの各列の名前を示す。
その次の行の出力は、最も「深い」場所にあるディレクトリ名を示して、それが
どこまで深い所にあるか(5/5なので5)、そのディレクトリが何個のファイルを持つか(1)、
それらのファイルのバイト数の合計はいくらなのか(値は0)を示している。
それより後の行の出力は、逐次それより前のディレクトリパスから最も「遠い」距離のものを
順次取り出している。ここで、距離は以下のように考えている。
まずdirocotopusは起点となるディレクトリがあって、そこから下に階層状に多数の
ディレクトリがぶら下がっている。それらを木構造のグラフとして、頂点(各ディレクトリ)
と辺(ディレクトリの親子関係)を考えることが出来る。まず、起点に何か(何でもよい)
色を付ける。そこから最も遠い頂点を探索する。ここで遠いとは、辺をいくつ経由するかを
数えることで、1,2,3.. のように距離を定義できるので、遠さや近さが定義できる。
そして、最初は起点から最も遠い頂点を見つけたら、その頂点の情報を(1行分)出力する。
そして、起点からその頂点までの辺と途中の辺は全て色を塗る。そして、色の塗られた
どの頂点からも、最も遠い色の塗られていない頂点を探し、その頂点の情報を(1行文)出力する。
そして、起点からその地要点までの辺と途中の辺は全て色を塗る。その時に色が代わった辺の
数が、その出力行の最初の数である(スラッシュ/で区切られた2番目の数は起点からの深さである)。
(従って、出力各行の最初の数は、大きい順に並ぶ。)
引数を何も指定しないと、起点は現行ディレクトリとなり、出力に並ぶディレクトリ(パス)は
12個となる。この数は オプション -g 100 のように変更が可能である。
📁📂 動作の詳細 📂📁
「最も遠い」場所が複数ある(距離が等しいものがいくつもある)場合は、どれを採用するのか
恣意的になるのでランダムになる。すなわち、このコマンドは、実行の度に、結果が変わりうる。
そのため、ランダムシードを -s で指定可能とする(-s 123のように指定する)ことで、
結果の再現性を確保するようにしている。
実際の出力は、一部が黄色で着色されている。これは、出力の上から順に初めて出現した
ディレクトリ名のパスについて、そのパスの内、最初の(つまり最上部の)ディレクトリ(ファイル)
の名前の文字列を黄色にしている。
オプション -. 0 (マイナス ピリオド (空白;無くてもよい) ゼロ) で、ドットファイル
(ピリオドで名前が始まるファイル)のディレトリを辿らないように指定することが可能である。
📁📂 このコマンド diroctopus の効用 📂📁
ls コマンドや find コマンドだと、大きな木構造のディレクトリの中を知ろうとしても、
前者は何度も反復が必要であり結果をその場で理解しても後で十分には思い出しにくく、
後者は大量にファイル名が流れるばかりで構造はつかみにくい。それらの弱点を
新しいコマンド diroctopus は補ってくれる。find . -type f は、a/b/cのような
パスが存在する場合、a と a/b と a/b/c の3個が全て表示されて見にくくなるが、
この diroctopus だと a/b/c の1個だけしか表示しないので、出力表がコンパクトである。
このコマンド diroctopus は(ネットワーク理論の枠組みで)「大きな有向の木構造をどう
把握すれば良いか」という概念的な問いのヒントになるかも知れない。