シンボリックリンクの一括張り直しシェル
先日5TBのHDDを買った流れでデータの整理整頓(ディレクトリ管理の見直しなど)をしていたところ、よく参照を行うファイルのシンボリックリンク集ディレクトリを作成していた箇所に大きな影響が出てしまい、一括でシンボリックリンクを張り直すことに。
…とインターネット検索でちょっと調べてみたら、一括で張り直すようなプログラムが見当たらない。そういうのって、ありそうなのに、なんで見つからないのか? 検索下手なのかな…と。
徐々に探すのが面倒くさくなってきたので、仕方がない「無きゃ作れスピリット」で、久々に頭の体操123!をする事に。
【2017/12/09 追記】
※↓エスケープ処理などをしておらず、メタキャラ系が入ると
動作が危険になる可能性があります。m(_ _)m
【ソース:replace-symbol.sh】
見て分かるように、シンボリックリンク内に第1引数の文字列がヒットしたら、それを第2引数の文字列に置換して、張り直す感じです。
…が、適当に作ったので、もしもコレをコピペする方は自己責任で。結構危険だと思います。(^^ゞ
実はコレ、昨晩(AM 3:00)に作成したのですが、この際17行目の引数$SRC, $DESTの順番を間違えてしまい(正確にはこの変数を作る箇所でawkに渡す$1, $2を間違えた)、「ln -fs」も相まって、約200個近くのファイルを破壊してしまいました。アギギー!!
普段定期的にバックアップを取っているので、リカバリは出来ましたが、サイズが数百GBオーダだったこと、rsyncで復元するにはかなり危険と判断したので、目視確認で手動のファイルコピーをしたという… お陰でこの復旧で昨日はほぼ徹夜で仕事に行きました…(´・ω・`)
最近のOSでは「# rm -rf /」は実行禁止になっているというのは聴きますが、「ln -sf」でもやっちまえるんだよなぁ~って感じです。
という感じで、普段寝てないから寝ぼけているという事ではなくて、普段手馴れていても勢い良くやってしまう…という目の覚めるような出来事でした。
現在はキレイにリンクを張り直せたので、事なきを得ましたが、「もしもミラーリングでバックアップしていたと思うとゾッとする… (ミラー先も破壊される)」、という事を思い知らされました。(もう何年も前にRAIDは止めて、手動で簡易コピー or rsyncするといったイケてないバックアップ運用にしています)
そして、このような簡単な自作シェルでもリンクが一気にピシッ!と揃った時は、物凄く気持ち良かったです。
最近のゲームプレーなんかよりも何倍も楽しかった気がしますw
さて、今日は昨日のお陰で疲労困憊なので、この糞日記を書いたら、AM 3:00までに寝るお。
…とインターネット検索でちょっと調べてみたら、一括で張り直すようなプログラムが見当たらない。そういうのって、ありそうなのに、なんで見つからないのか? 検索下手なのかな…と。
徐々に探すのが面倒くさくなってきたので、仕方がない「無きゃ作れスピリット」で、久々に頭の体操123!をする事に。
【2017/12/09 追記】
※↓エスケープ処理などをしておらず、メタキャラ系が入ると
動作が危険になる可能性があります。m(_ _)m
【ソース:replace-symbol.sh】
#!/bin/bash
if [ $# -ne 2 ]; then
echo "[Usage]"
echo " $0 <src string> <dest string>"
exit 1
fi
# ls の出力からシンボリックリンクの行だけ抽出
ls -l|grep '^l'|awk '{for(i=10;i<NF;i++){printf("%s%s",$i," ")}print $NF}'|while read line
do
# 元となるファイル名 -> 置換
SRC=`echo "${line}"|awk -v src=$1 -v dest=$2 -F' -> ' '{result = $2; gsub(src, dest, result); print result}'`
# 先となるファイル名 (元々のシンボリックリンクファイル)
DEST=`echo "${line}"|awk -F' -> ' '{print $1}'`
# シンボリックリンクを張り直す
exe=`echo "ln -sf '$SRC' '$DEST'"`
echo $exe
eval $exe
done
見て分かるように、シンボリックリンク内に第1引数の文字列がヒットしたら、それを第2引数の文字列に置換して、張り直す感じです。
…が、適当に作ったので、もしもコレをコピペする方は自己責任で。結構危険だと思います。(^^ゞ
実はコレ、昨晩(AM 3:00)に作成したのですが、この際17行目の引数$SRC, $DESTの順番を間違えてしまい(正確にはこの変数を作る箇所でawkに渡す$1, $2を間違えた)、「ln -fs」も相まって、約200個近くのファイルを破壊してしまいました。アギギー!!
普段定期的にバックアップを取っているので、リカバリは出来ましたが、サイズが数百GBオーダだったこと、rsyncで復元するにはかなり危険と判断したので、目視確認で手動のファイルコピーをしたという… お陰でこの復旧で昨日はほぼ徹夜で仕事に行きました…(´・ω・`)
最近のOSでは「# rm -rf /」は実行禁止になっているというのは聴きますが、「ln -sf」でもやっちまえるんだよなぁ~って感じです。
という感じで、普段寝てないから寝ぼけているという事ではなくて、普段手馴れていても勢い良くやってしまう…という目の覚めるような出来事でした。
現在はキレイにリンクを張り直せたので、事なきを得ましたが、「もしもミラーリングでバックアップしていたと思うとゾッとする… (ミラー先も破壊される)」、という事を思い知らされました。(もう何年も前にRAIDは止めて、手動で簡易コピー or rsyncするといったイケてないバックアップ運用にしています)
そして、このような簡単な自作シェルでもリンクが一気にピシッ!と揃った時は、物凄く気持ち良かったです。
最近のゲームプレーなんかよりも何倍も楽しかった気がしますw
さて、今日は昨日のお陰で疲労困憊なので、この糞日記を書いたら、AM 3:00までに寝るお。
コメント
コメントの投稿
« 平和な休日 l Home l 暑気払い飲み会+送別会 »