Hatena::ブログ(Diary)

(ひ)メモ このページをアンテナに追加 RSSフィード

2006-01-18 (Wed)

リモートホストとdiffる

bashの「Process Substitution」という機能で、コマンドの実行結果を名前つきパイプから読めます。(thx かつみくん)

$ cat -n <(date; echo foo)
     1  Wed Jan 18 21:38:30 JST 2006
     2  foo

これを使って、リモートホストのファイルとdiffを取るシェル関数を作ってみました。

こんな感じで使えます。

$ rdiff -u ~/s.txt REMOTE_HOST:~/d.txt

また-Rオプションで、rsyncの-R, --relativeオプションの様にローカルホストのパスをリモートホストの相対パスとして指定できます。たとえば、ローカルホストの/very/very/long/path/t.txtとリモートホストの同じパスのファイルをdiffるときには次のようにしてリモートホスト側のパス指定を略記することができます。

$ rdiff -uR /very/very/long/path/t.txt REMOTE_HOST:/

ローカルマシンとサーバ上のファイルの比較や、同じ構成のサーバがたくさんあるときのファイル比較に使うとすごぉく便利です。

rdiff() {
  diff_orig=$(which diff 2>/dev/null)
  if [ -z "$diff_orig" ]; then
    echo "cannot find diff command." 1>&2
    return 1
  fi

  declare -a opts
  declare -a files

  optv=("$@")
  optc=${#optv[@]}

  files=(${optv[$optc-2]} ${optv[$optc-1]})
  unset optv[$optc-1]
  unset optv[$optc-2]

  file_relative=
  i=0
  for o in "${optv[@]}"; do
    case "$o" in
      *R*)
        optv[$i]=$(echo $o | sed -e 's/\-\?R//g')
        files[0]=$(readlink -f ${files[0]})
        file_relative=${files[0]}
        ;;
    esac
    i=$(($i+1))
  done
  optv=(${optv[@]})

  case "${files[@]}" in
    *:*)
      for i in 0 1; do
        case ${files[$i]} in
          *:*)
            eval $(echo ${files[$i]} | awk -F':' '{printf "t_host=%s t_file1=%s", $1, $2}')
            if [ -n "$file_relative" ]; then
              t_file1="$file_relative"
            fi

            files[$i]=<(ssh $t_host cat $t_file1)
            ;;
          *)
            ;;
        esac
      done
      ;;
    *)
      ;;
  esac

  $diff_orig "${optv[@]}" "${files[@]}"
}

rehashrehash 2006/01/21 10:19 zsh&sshなら
% diff localhostfile =(`ssh remotehost ’cat remotehostfile’`)
で簡単っす。

tenyteny 2006/02/02 10:18 bash&sshでも、
$ ssh remotehost ’cat remotefile’ | diff -u localfile -
で行けますよ。

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。

2003 | 11 | 12 |
2004 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 05 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 12 |
2012 | 01 | 02 | 03 | 06 | 08 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 |
2015 | 01 | 02 | 07 | 10 |
2016 | 01 | 05 | 10 | 12 |
2017 | 07 |
Connection: close