わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

ディレクトリ移動,リンクURL取得

if [ ${+CYGWIN} = 1 ]
then
  alias cdc='cd $(getclip)'
fi

(略)
cdcは,QTTabbarでフォルダを開いていて,シェルでそこに移動したいときに使います.具体的には,QTTabbarでタブ名を右クリックするとメニューが出ますが,ここで「パスをコピー」を選びます.すると,「C:\Users\takehiko」といった文字列がクリップボードに入ります.そのあと,cdcを実行すると,「cd C:\Users\takehiko」を実行することになり,/cygdrive/c/Users/takehikoに移動します.

ディレクトリ移動とtexコンパイルのalias - わさっき

便利と思っていたけど,トラブル発生.フォルダ名に「&」を含んでいるとき,cdできませんでした.

if [ ${+CYGWIN} = 1 ]
then
  alias cdc='cd "$(getclip)"'
fi

と書き換えることで,大丈夫になりました.
自分は普段,「&」を含めるようなフォルダ名やファイル名にすることはないのですが,ある事情で,とある方の「お気に入り」をzip圧縮したファイルをいただきまして,これをzshワンライナーで処理したいなあと思ったのでした.ファイル名(フォルダ階層を含む)と,URLを取り出して,一覧出力したいのです.
いただいたファイルの中身はここに書けませんので,手元の環境で説明します.Vistaの場合,/cygdrive/c/Users/自分の名前/Favorites が,お気に入りを置くフォルダとなっています.ここでたとえば「Microsoft の Web サイト\マイクロソフト ホーム.url」の中身を見ますと,

[InternetShortcut]
URL=http://go.microsoft.com/fwlink/?LinkId=72520
IDList=
[{000214A0-0000-0000-C000-000000000046}]
Prop3=19,2

となっていました.この「URL=」の行を取り出した上で,「URL=」を削除すればいいわけです.grepsedの組み合わせですね.
他の(いただいた中の)ファイルには,「BASEURL=」から始まる行もあったりしますが,これは無視しないといけません.
ということでコマンドは以下の通り.

$ for f in **/*.url; do echo $f | sed -e 's/.url$//'; grep '^URL=' $f | sed -e 's/^URL=//'; echo; done

ファイルに出力するときは,全体をカッコで囲って,「>ファイル名」です.
とはいえ,実行時間が馬鹿になりません.一つのファイルに,sedを2回というのは,どんくさいです.全体をとってから,sedで切り取りましょう.

$ (for f in **/*.url; do echo $f; grep '^URL=' $f; echo; done) | sed -e 's/.url$//;s/^URL=//'

ファイルに出力するときは,全体をカッコで囲む必要はありません.
これで,瞬時とはいかないまでも,ストレスを感じないくらいになりました.