Bash: переместить файл / каталог и создать ссылку на него - PullRequest
1 голос
/ 12 февраля 2012

Я пытаюсь создать скрипт 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

И каталог не перемещается в каталог_опередачи, а перемещается только его содержимое.

#!/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%/}"

Может некоторыеодин, пожалуйста, помогите?

1 Ответ

4 голосов
/ 12 февраля 2012

Проблема в том, что $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. Он рекурсивно создает каталог и всех необходимых родительских каталогов, и он не против, если каталог уже существует.)

...