ディレクトリを同様のディレクトリ構造にすばやく変更しますか?

ディレクトリを同様のディレクトリ構造にすばやく変更しますか?

テスト環境では、ログファイルのディレクトリ構造は次のとおりです。

/var/Logs/int/app-id/region-code/log/file-name.log
/var/Logs/sat/app-id/region-code/log/file-name.log
/var/Logs/cat/app-id/region-code/log/file-name.log

環境ごとに多くのアプリケーションIDがあり、アプリケーションIDごとに複数の地域コードがあります(アプリケーションによって異なります)。

ディレクトリをintからsatに変更し、パスの残りの部分をすべて同じに保つことができるコマンドはありますか?このように:

$ pwd
/var/Logs/int/abc/01/log
$ cdswap int sat
$ pwd
/var/Logs/sat/abc/01/log
$ cdswap abc def
$ pwd
/var/Logs/sat/def/01/log

これがうまくいけばいいでしょう。

$ cdswap def/01 ghi/02
$ pwd
/var/Logs/sat/ghi/02/log

そのようなコマンドがない場合は、同じ操作を効果的に実行するようにエイリアスを設定できますか?どうですか?

ご協力ありがとうございます!

ベストアンサー1

cdswapzsh では、cd.... 2 つの引数が指定されたら、cd現在のディレクトリの最初の引数を 2 番目の引数に置き換え、結果ディレクトリに変更します。

cd関数を作成してbashでこれをシミュレートできます。

cd () {
  local i=1
  while [[ "${!i}" = -* ]]; do ((++i)); done
  if ((i == $# - 1)); then
    local operands
    operands=("$@")
    operands[$i]=${PWD/${!i}/${!#}}
    if [[ "${operands[$i]}" == "$PWD" ]]; then
      echo >&2 "cd: string not in pwd: ${operands[$i]}"
      return 1
    fi
    set -- "${operands[@]:$(($#-1))}"
  fi
  builtin cd "$@"
}

おすすめ記事