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の出力)とファイル名をつないだ絶対パスが取得され、ようやく目的を達成することができた。