スマートにcdを使う(その2)

CDPATHにパスを登録することで、cdで楽ができることは分かりましたが、新たに遭遇したディレクトリ構造において、どのディレクトリをCDPATHに登録すれば効率的かわかりません。
そのような場合は、すべてのディレクトリを対象にCDPATHへ登録してしまえば良いです。
linuxのカーネルソースを例に確認してみましょう。

まずはカーネルソースの取得です。ダウンロードするためにwgetもインストールしておきます。また、tar.xz圧縮ファイルは、tarコマンドで解凍(伸長)できます。

~$ sudo apt-get install wget
~$ wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.5.2.tar.xz
~$ tar xJf linux-4.5.2.tar.xz
~$ ln -s linux-4.5.2 /usr/src/linux
~$ cd /usr/src/linux

カーネルのディレクトリ構造において、一番長いディレクトリ名の長さはいかほどでしょうか。wcで確認してみます。

/usr/src/linux$ find -type d | wc -L
58
/usr/src/linux$ 

58文字が最長のようです。該当するディレクトリを確認してみます。sedを使います。

/usr/src/linux$ find -type d | sed -ne '/^.\{58\}$/p'
./tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace
./Documentation/devicetree/bindings/memory-controllers/fsl
./Documentation/devicetree/bindings/powerpc/fsl/cpm_qe/cpm

さて、この長いパスをいちいち手で入力していては骨が折れるというか、本当に折れるかもしれません。CDPATHへ登録してみましょう。
やはり、findを使います。CDPATHは:(コロン)で区切って登録すれば良いので、findの結果を:(コロン)で区切ってやればよいです。

/usr/src/linux$ CDPATH=`find -type d | tr \n :`
/usr/src/linux$ 

これでCDPATHへの登録が完了しました。
試しに、最長のディレクトリの一番最初に見つかった〜/Traceにディレクトリ切り替えしてみましょう。

/usr/src/linux$ cd Trace
/usr/src/linux/tools/perf/scripts/perl/Perf-Trace-Util/lib/Perf/Trace
/usr/src/linux/tools/perf/scripts/perl/Perf-Trace-Util/lib/Perf/Trace$ 

うまく行きました。
次に、最長のディレクトリの2番目に見つかった〜/fslのディレクトリに切り替えたいと思います。

/usr/src/linux$ cd fsl
/usr/src/linux/arch/powerpc/boot/dts/fsl
/usr/src/linux/arch/powerpc/boot/dts/fsl$ 

あれ、どうしたことでしょう。パスが期待していたものと異なります。なぜでしょうか。
実はfslというディレクトリは、複数存在しています。
findすると、以下のように6つ確認できました。

usr/src/linux$ find -type d -name fsl
./arch/powerpc/boot/dts/fsl
./include/linux/fsl
./Documentation/devicetree/bindings/memory-controllers/fsl
./Documentation/devicetree/bindings/soc/fsl
./Documentation/devicetree/bindings/powerpc/fsl
./sound/soc/fsl
/usr/src/linux$ 

fslというデイレクトリについて、CDPATHの方がどのように登録されているか確認してみます。

/usr/src/linux$ echo $CDPATH | tr : \\n | grep fsl$
./arch/powerpc/boot/dts/fsl
./include/linux/fsl
./Documentation/devicetree/bindings/memory-controllers/fsl
./Documentation/devicetree/bindings/soc/fsl
./Documentation/devicetree/bindings/powerpc/fsl
./sound/soc/fsl
/usr/src/linux$ 

当然ですが、findの結果と同じになります。
つまり、重複しているディレクトリの場合は、CDPATHの最初に登録したパスが適用されるわけです。

ではカーネルソースにおいて、ディレクトリ名の重複はどのぐらいあるのでしょうか。

/usr/src/linux$ tree -id | sort | uniq -d | wc -l
475
/usr/src/linux$ 

475件ありました。
どのようなディレクトリが重複しているのでしょうか重複の多い10件をあげてみました。

/usr/src/linux$ tree -id | sort | uniq -cd | sort | tail
     19 oprofile
     26 boot
     31 configs
     33 uapi
     34 mm
     37 kernel
     42 lib
     55 mach
     86 asm
    127 include
/usr/src/linux$ 

includeは、127件もディレクトリ名として使われています。
このような重複件数の多いディレクトリ構成で、果たしてCDPATHは役に立つのでしょうか。

重複していないディレクトリ名も確認してみましょう。

/usr/src/linux$ tree -id | sort | uniq -u | wc -l
1428
/usr/src/linux$ 

1428件も見つかりました。
重複しているディレクトリよりも多いので、CDPATHが有効に使えるのではないでしょうか。

2 responses to “スマートにcdを使う(その2)

  1. Thninikg like that is really amazing

  2. I see you don’t monetize your page. You can earn extra passive income, your niche is good for
    one method, just search in google – website monetization methods by Riggso

Leave a Reply to Aimee81 Cancel reply

Your email address will not be published. Required fields are marked *

CAPTCHA