Shell-Script
移動文件並用符號連結替換它
有人可以給我一個命令:
- 將文件移至新目錄
- 並在舊位置留下一個指向新位置的符號連結
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