2012-02-12 6 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: 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

Определить, что «не работает должным образом». –

+0

Да, я отредактировал вопрос. Спасибо. – Reggian

+0

пока что я тестировал ваш скрипт, кажется, работает нормально! – Sujoy

ответ

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

+0

@Reggian: Добро пожаловать! – ruakh

+0

ах, у меня также был создан каталог! Хорошо поймал – Sujoy

Смежные вопросы