0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【シェル】ディレクトリを再帰的にリストし、コマンドサーチパス型式に整形して出力する

Last updated at Posted at 2021-05-13

ネットで落としてきたフリーのツール類、アーカイブを解凍してみたら、実行ファイルが1つだけと思いきや、実行ファイルや DLL ファイル、そのほか設定ファイルと思わしきものなどが解凍されたディレクトリ以下に複数ディレクトリ/ファイルとして格納されていて、どれがラインタイムで必要なものか判らない。 そんなことがたまにある(bind9 とか nmap とか)。
こんなとき、メンドくさいから、解凍してできたトップディレクトリを丸ごと /usr/local/bin なんかにストアするのだけど、こんなのが複数ある場合に、それぞれに PATH を通すのは面倒だし、その後も同種のツールが増える都度、PATH に追加するのはさらに面倒。

例えば /usr/local/bin の下に、

/usr/local/bin/tool_1/
/usr/local/bin/tool_2/
/usr/local/bin/tool_3/
/usr/local/bin/tool_3/subDir

のようにディレクトリがある場合には、それらのサブディレクトも含めて、

PATH=$PATH:/usr/local/bin/*

のようなイメージで記述すれば、一発で、

PATH=$PATH:/usr/local/bin:/usr/local/bin/tool_1:/usr/local/bin/tool_2:/usr/local/bin/tool_3:/usr/local/bin/tool_3/subDir

のように展開されれば楽なのに。

そこで、あるディレクトリ以下のサブディレクトリを再帰的にリストして、それらを':'で区切られた1行のテキスト(「コマンドサーチパス型式」と表現してみる)に整形できれば、と考えた。

先哲の知恵を求めて色々ネットをググったのだが見つからない。
そこで、ここ( https://hacolab.hatenablog.com/entry/2019/07/29/235312 )なども参考にして、こんなコマンドラインを発案。

\$ find /usr/local/bin -type d -print | sed -e ':loop' -e 'N; $!b loop' -e 's/\n/:/g'

結果は良好。
これをバッククオートで挟んで、.bash_profile なんかに

PATH=\$PATH:`find /usr/local/bin -type d -print | sed -e ':loop' -e 'N; \$!b loop' -e 's/\n/:/g'`
と書いとけば、期待通りのコマンドサーチパスが $PATH にセットされる。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?