誰かが私に命令を出すことができますか?
- ファイルを新しいディレクトリに移動
- 新しい場所を指す古い場所にシンボリックリンクを残します。
ベストアンサー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