web-dev-qa-db-ja.com

ディレクトリ内のすべてのファイル(ファイルのクラス)へのシンボリックリンクを作成するにはどうすればいいですか?

特定のディレクトリにあるすべてのファイル(またはln -sで終わるファイルのクラス)へのシンボリックリンク(.bar)を作成したいです。私がcwdに入っていて、ls ../source/*.barと入力すると

foo.bar
baz.bar

パラメータリストをln -sに渡して、最終的に解決することができます。

ln -s ../source/foo.bar
ln -s ../source/baz.bar

もちろん私はbashスクリプトを書くことができることを知っていますが、xargsなどを含むもっと単純なものがあるはずです - 少なくとも私にとってはそれは一般的なタスクのようです。

35
dastrobu

lnは複数の引数を取りますが、その場合はターゲットディレクトリを指定することを忘れないでください。

ですから、あなたの例では.がターゲットディレクトリなので、同じくらい簡単であるべきです。

ln -s ../source/*.bar .

man lnから。上記のコマンドは3番目の形式を使用します。

ln [OPTION]... [-T] TARGET LINK_NAME   (1st form)
ln [OPTION]... TARGET                  (2nd form)
ln [OPTION]... TARGET... DIRECTORY     (3rd form)
ln [OPTION]... -t DIRECTORY TARGET...  (4th form)
  • 1番目のフォームで、LINK_NAMEという名前のTARGETへのリンクを作成します。
  • 2番目の形式では、現在のディレクトリにTARGETへのリンクを作成します。
  • 3番目と4番目の形式では、DIRECTORYに各TARGETへのリンクを作成します。
67
mpy

findを使う

certainDir="/path/to/dir"
find -name "*.bar" -exec ln -s {} "$certainDir" \;

また、シンボリックリンクではフルパス(可能な場合)を使用することを忘れないでください。

3
justbrowsing

Globstar(bash/zsh:shopt -s globstarで設定)を使って再帰的に試すことができます。

ls -vs ../**/*.bar .

注:冗長のために-vを追加しました。

リストが長すぎる場合は、findユーティリティを使用します。

find .. -name \*.bar -exec ln -vs "{}" dest/ ';'

これはdest/にリンクを作成するか、現在のフォルダの場合は.に変更します。

3
kenorb

cpオプションと-sオプションを組み合わせると、ソフトリンクを作成できます(ハードリンクの場合は-l)。

現在のディレクトリからこのように使用することができます:

$ cp -s ../path/with/scripts/* .

あなたの場合、それはこのようになるでしょう:

$ cp -s ../source/*.bar .
0
cy8g3n