Linuxでシンボリックリンクの付け直しをする方法


ディレクトリ~/gaga 以下に、~/gogo以下のファイルやディレクトリへのシンボリックリンクが大量かつ階層的に存在します。

しかしファイルの実体が~/gogo以下から~/gege以下に移動してしまいました
~/gogo以下は別の用途で使うので、 ln -s ~/gege ~/gogo として解決することはできません。

というわけで、スクリプトで一気にリンク先を付け直す方法を教えてください。

ただし、~/gaga以下にはシンボリックリンクでないファイルや、~/gege以下のファイルではないものへのシンボリックリンクも混じっています。これは変更したくありません。

shかpythonが希望ですがcshやperlでも可とします
そのまま動くスクリプトでお願いします。

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2010/03/19 20:11:30
  • 終了:2010/03/26 15:06:33

ベストアンサー

id:mjy No.1

mjy回答回数67ベストアンサー獲得回数202010/03/19 22:05:43

ポイント80pt
#! /bin/sh

target=~/gaga
from=~/gogo
to=~/gege

find $target -lname $from'/*' -printf '%l %p\n' |sed "s#^$from#ln -fs $to#" |sh

その他の回答(2件)

id:mjy No.1

mjy回答回数67ベストアンサー獲得回数202010/03/19 22:05:43ここでベストアンサー

ポイント80pt
#! /bin/sh

target=~/gaga
from=~/gogo
to=~/gege

find $target -lname $from'/*' -printf '%l %p\n' |sed "s#^$from#ln -fs $to#" |sh
id:kick_m No.2

kick_m回答回数1372ベストアンサー獲得回数542010/03/20 01:10:20

シェルスクリプトというものを勉強してください。http://www

id:shiumachi No.3

shiumachi回答回数3ベストアンサー獲得回数12010/03/21 10:32:22

ポイント10pt

こんな感じでどうでしょうか。

リンク先のパス名の中に gogo を含む全てのシンボリックリンクを対象に、リンク先を強制的に ~/gege/ 以下のファイルとするよう書き換えました。


id:pogemutaBN

すいませんが、肝心の所が読めません

2010/03/26 15:04:27
  • id:shiumachi
    >すいませんが、肝心の所が読めません
    大変失礼しました。
    これでどうでしょうか?

    >|sh|
    #!/bin/sh
    cd ~/gaga
    for i in `find * -lname "*../gogo*"`;do
    ln -fs ~/gege/${i} ${i}
    done
    ||<
  • id:shiumachi
    あれ、もしかしてはてな記法は人力検索で使えないのでしょうか?
    重ね重ね失礼しました……。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません