Shell-Script

移動文件並用符號連結替換它

  • September 6, 2018

有人可以給我一個命令:

  • 將文件移至新目錄
  • 並在舊位置留下一個指向新位置的符號連結

mv移動文件,並ln -s創建符號連結,因此基本任務由執行以下兩個命令的腳本完成:

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

有一些注意事項。如果第二個參數是一個目錄,那麼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"

另一個需要注意的是,第一個參數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

引用自:https://unix.stackexchange.com/questions/228015