libstdc++ のドキュメントを Cygwin から・・・

C++のドキュメントをCygwinからmanで引きたいー!!
で,Debian のパッケージの libstdc++6-4.3-doc_4.3.2-1.1_all.deb
インストールしようと思ったのだが,かなーりはまったので,メモメモ。


debファイルは,arコマンドで解体できることは,わかった。

% ar xv libstdc++6-4.3-doc_4.3.2-1.1_all.deb
x - debian-binary
x - control.tar.gz
x - data.tar.gz

アーカイブの中身をのぞくと,目的のファイルは,data.tar.gzにあることがわかった。
何気なく,tar xzvf data.tar.gz すると,Invalid Argumentとかいわれ怒られること,
怒られること。


さ,こっからはまっていくわけです。
どうやら,ファイル名に「:」(コロン)を含んでいるから,こけているらしい。
ほう。で,tar --help と Web で --force-local を使えばいいのかと思ふ。
tar --force-local -xzvf data.tar.gz
しかし,相変わらず,怒られる。


しゃーないので,ググる


「--force-local」オプションは,アーカイブファイル自体のファイル名にコロンを含んでいる時に,
効果を発揮するということがわかる。ほほぉ。なるほどね。


で,同じことをやっている人を発見!!
http://www.nabble.com/Unix-tar-file-with-colons-in-archived-file-names-td11692093.html
から抜粋。

Re: Unix tar file with colons in archived file names

by Lewis Hyatt :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message
>
> When the cygwin tar recognizes this, due to Windows restrictions, the output
> file is not properly extracted. I Googled around and found options for
> --force-file and http://cygwin.com/ml/cygwin/2001-01/msg01536.html this
> link , but I still can't get this to work properly.
>
> I am able to get the files extracted if I use WinRAR (it converts : to _ on
> extract), but I'd prefer to do this from the shell since I can automate this
> more readily. Any ideas how I can do this?

just use "--transform='s/:/_/g'", you can turn the colons into whatever
you want.

  • lewis

ほー,--transform なんていうオプションがあったのですね。sedのexpressionで
ファイル名を置換できるわけですね。ふむふむ。
これで,1回置換して伸張して,その後にコロンを含んだファイル名に変更すれば
よろしいわけだ!! なーんて,この時点では考えてました。
というわけで,あとあとファイル名を変更することを考えて,「:」を「%」にしておこう。


で,伸張して,

% for fname in `ls` ; do dest=`echo $fname | sed -e 's/%%/::/g'` ; mv "$fname" "$dest" ; done ;

を実行。
あれ? 怒られるよ。
ちなみに,同じことは,
% rename %% :: *
でできるということも発見。
(参考ページ http://d.hatena.ne.jp/srkzhr/20070919)
ま,怒られることには変わりないけど。


で,しばらくネットサーフィングって,Windowsでは,ファイル名にコロンを使用できない,
という考えてみればあたりまえのことを発見する。がーーーん。


しゃーない。なら,アンダースコア使っとこ。
ほいで,usr/share/man/man3 以下のファイルを,/usr/share/man/man3 以下にコピー。
試したところ,

%man std__array

で,std::array を引けているので,オッケーっぽい。


だが,「man -k」がどうなるか。

% man -k std::array
std::array: nothing appropriate
% man -k std__array
std__array: nothing appropriate

うーむ。あっ。そうそう,データベースファイルを更新しないとね。

% /usr/sbin/makewhatis    # <-- 今ここ

makewhatis が終わらん。CPU100%なのだが,頑張っているのか,さぼっているのかは不明。
以前やったときも時間がかかった記憶はあるが,ここまでかかったっけな?
ま,いいや,そっとしとこう。


まとめ!!
  • tarアーカイブのファイル名にコロンが含まれている場合は,--force-local。
  • Windows上ではファイル名にコロンを使用できない。<--これ重要。
  • tarアーカイブの中身のファイルの名前を,伸張時に変更したい場合は,--transformオプション。
  • manファイルを追加した場合は,makewhatisをすると幸せになれるかも。。。
※追記

今さっきmakewhatis終わった。35分くらいかかった。
man -k std::array, man -k std__array の結果は,どっちもだめぽorz
わかったことは,man C++Intro からたどれるということ。
とりあえず,man C++Intro しとけば,目的のページにたどり着けそう。