我正在尝试创建一个bash脚本,将文件或目录从源目录移动到目标目录,并将符号链接放入源目录。
因此,<source_path>
可以是文件或目录,<destination_dir_path>
是我希望原始文件移动到的目录。
样本用法:
$ mvln /source_dir/file.txt /destination_dir/
OR
$ mvln /source_dir/dir_I_want_to_move/ /destination_dir/
这是我设法放在一起的,但它无法正常工作。 它仅在source是目录时有效,否则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%/}"
有人可以帮忙吗?
答案 0 :(得分: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
有用。它递归地创建了一个目录和所有必要的父目录,它并不介意如果目录已存在。)