はじめに
複数のファイルに対して、一括でシンボリックリンクを作成する方法。
親ディレクトリ単位でかけるのが一番手っ取り早いし楽なのですが、最近たまたまその手が使えないケースに遭遇したのでここに書いてみる。
やり方
例として、あるディレクトリ内のtxtファイルのみ頭に「link.」と付けたシンボリックリンクを作成したい場合。
一ファイルずつやるとしたら当然、
$ ln -s test.txt link.test.txt
これで簡単にできます。
ただし、まとめて複数のtxtファイルに一括でシンボリックリンクを張りたい場合、特に意識せずワイルドカード使えばいけるかな?とか何となく思ったりもしますが、
$ ln -s *.txt link.*.txt
ln: 宛先の `link.*.txt' はディレクトリではありません
ディレクトリではありませんと怒られます。
そこでlsコマンドでファイル名の末尾が.txtファイルだけ抜き出し、
その結果をxargsで渡してやると無事に一括でのシンボリックリンクの作成が出来ます。
$ ls *.txt | xargs -I{} ln -s {} link.{}
ちなみにfindコマンドで同じことをやるとこうなる。
$ find *.txt -type f -print | xargs -I{} ln -s {} link.{}
このfindコマンドを使う場合だと、複数のディレクトリの名前にある共通のキーワードが入ってるファイルのシンボリックリンクの作成先を一か所にまとめたりとかできるのかな。試してないけど。
おわりに
ある程度規模の大きい案件とかだと、システム間連携の際に連携元ファイルの出力先と連携先で参照しているパスが違うためにわざわざ手動でコピーする運用になってたり、などというケースも割とあるので、シンボリックリンクを使って楽に出来るところは楽にしましょう、というお話。
勿論ファイル名なりパス名をシステム間で合わせるのが一番楽なのですが、古いシステムとかだと、出力先を変更するのはそれなりにリスクもあったりしますし、中にはハードコーティングされちゃってるケースもあったりするので・・・・・・