Bashで複数のシンボリックリンクをまとめて張る方法

Bashを使っていてあるディレクトリにある大量のファイルへのシンボリックリンクをまとめて張りたいと思ったが、若干手こずったのでメモ。
カレントディレクトリのファイル(ここでは./*.txt)を対象とするとします。

単に

ln -s *.txt /path/to/destination

とするとワイルドカードが展開されないようで*が入ったままのファイル名でシンボリックリンクが張られ、そんなファイル知らないと怒られる。

そこで考えるのがシェルスクリプト。forループで*.txtというリストに対してlnを使えばいいんだろ、と安易に考え

for i in *.txt
do
  ln -s $i /path/to/destination
done

と書いて実行するも、絶対パスが渡されてないようで、これもリンク切れのシンボリックリンクが出来るだけ。で、やり直したのが以下の通り。

for i in *.txt
do
  ln -s $(pwd)/$i /path/to/destination
done

これは()内のコマンドが展開されるというBashの機能を使ったもの。これでカレントディレクトリ(pwdの出力)とファイル名をつないだ絶対パスが取得され、ようやく目的を達成することができた。

Bashの()コマンドの展開は入れ子にしても動くようで、これからもちょっとした応用に便利かも。

参考: http://labs.unoh.net/2008/09/bashtips.html