ファイルを移動してシンボリックリンクに置き換える

ファイルを移動してシンボリックリンクに置き換える

誰かが私に命令を出すことができますか?

  • ファイルを新しいディレクトリに移動
  • 新しい場所を指す古い場所にシンボリックリンクを残します。

ベストアンサー1

mvファイルが移動されln -sシンボリックリンクが生成されるため、基本的な操作は次の2つのコマンドを実行するスクリプトを介して実行されます。

#!/bin/sh
mv -- "$1" "$2"
ln -s -- "$2" "$1"

いくつかの注意事項があります。 2番目の引数がディレクトリの場合、mvファイルはそのディレクトリに移動されますが、ln -s移動されたファイルの代わりにそのディレクトリへのリンクが作成されます。

#!/bin/sh
set -e
original="$1" target="$2"
if [ -d "$target" ]; then
  target="$target/${original##*/}"
fi
mv -- "$original" "$target"
ln -s -- "$target" "$original"

注目すべきもう1つの点は、最初のパラメータがln -sシンボリックリンクの正確なテキストであることです。これは、コマンドが実行されるディレクトリではなく、ターゲットの場所に基づいています。元の場所が現在のディレクトリになく、宛先が絶対パスとして表示されない場合、リンクは正しくありません。この場合、パスを再作成する必要があります。この場合、絶対リンクを作成します(相対リンクは良いですが、正しく接続するのは難しいです)。このスクリプトでは、改行で終わるファイル名がないと仮定します。

#!/bin/sh
set -e
original="$1" target="$2"
if [ -d "$target" ]; then
  target="$target/${original##*/}"
fi
mv -- "$original" "$target"
case "$original" in
  */*)
    case "$target" in
      /*) :;;
      *) target="$(cd -- "$(dirname -- "$target")" && pwd)/${target##*/}"
    esac
esac
ln -s -- "$target" "$original"

ファイルが複数ある場合は、繰り返し見てください。

#!/bin/sh
while [ $# -gt 1 ]; do
  eval "target=\${$#}"
  original="$1"
  if [ -d "$target" ]; then
    target="$target/${original##*/}"
  fi
  mv -- "$original" "$target"
  case "$original" in
    */*)
      case "$target" in
        /*) :;;
        *) target="$(cd -- "$(dirname -- "$target")" && pwd)/${target##*/}"
      esac
  esac
  ln -s -- "$target" "$original"
  shift
done

おすすめ記事