2012-02-12 114 views
1

我想做一個bash腳本,將文件或目錄從源目錄移動到目標目錄,並將它的符號鏈接放到源目錄中。Bash:移動文件/目錄,並創建它的鏈接

所以,<source_path>可以是一個文件或目錄,<destination_dir_path>是我想要原始移動到的目錄。

使用範例:

$ mvln /source_dir/file.txt /destination_dir/ 
OR 
$ mvln /source_dir/dir_I_want_to_move/ /destination_dir/ 

這是我設法放在一起,但它不能正常工作。 它只能如果源是一個目錄,否則MV返回一個錯誤:

mv: unable to rename `/source_dir/some_file.txt': Not a directory 

而且目錄沒有移動到destination_directory但只有其內容被移動。

#!/bin/bash 

SCRIPT_NAME='mvln' 
USAGE_STRING='usage: '$SCRIPT_NAME' <source_path> <destination_dir_path>' 

# Show usage and exit with status 
show_usage_and_exit() { 
    echo $USAGE_STRING 
    exit 1 
} 

# ERROR file does not exist 
no_file() { 
    echo $SCRIPT_NAME': '$1': No such file or directory' 
    exit 2 
} 

# Check syntax 
if [ $# -ne 2 ]; then 
    show_usage_and_exit 
fi 

# Check file existence 
if [ ! -e "$1" ]; then 
    no_file $1 
fi 

# Get paths 
source_path=$1 
destination_path=$2 

# Check that destination ends with a slash 
[[ $destination_path != */ ]] && destination_path="$destination_path"/ 

# Move source 
mv "$source_path" "$destination_path" 

# Get original path 
original_path=$destination_path$(basename $source_path) 

# Create symlink in source dir 
ln -s "$original_path" "${source_path%/}" 

有人可以幫忙嗎?

+2

定義「無法正常工作」。 – 2012-02-12 19:16:58

+0

是的,我編輯了這個問題。謝謝。 – Reggian 2012-02-12 19:22:56

+0

到目前爲止,我測試過你的腳本似乎工作正常! – Sujoy 2012-02-12 19:33:49

回答

4

問題是$destination_path引用了一個不存在的目錄。事情是這樣的:

mv /path/to/file.txt /path/to/non/existent/directory/ 

返回一個錯誤,並且

mv /path/to/directory/ /path/to/non/existent/directory/ 

將重命名/path/to/directory//path/to/non/existent/directory/(前提是/path/to/non/existent/是一個存在的目錄,只是沒有命名directory的子文件夾)。

如果你期待的是$destination_path不存在,那麼你可以添加一個mkdir命令:

mkdir "$destination_path" 
mv "$source_path" "$destination_path" 

如果你期待它可能不存在,那麼你可以有條件地添加它:

[[ -d "$destination_path" ]] || mkdir "$destination_path" 
mv "$source_path" "$destination_path" 

,如果你希望它確實存在,那麼你有一些調試呢!

(順便說一下,根據您的具體情況,你可能會發現mkdir -p是有益的,它遞歸地創建一個目錄所有必需的父目錄,如果目錄已經存在,它不介意。)

+0

這個技巧。謝謝! – Reggian 2012-02-12 19:48:11

+0

@ Reggian:不客氣! – ruakh 2012-02-12 20:29:37

+0

啊我也有創建的目錄!很好的捕獲 – Sujoy 2012-02-12 22:22:47

相關問題