/ / Bash: перемістити файл / каталог і створити посилання на нього - linux, bash, shell, move, symlink

Bash: перемістити файл / каталог і створити посилання на нього - linux, bash, shell, move, symlink

Я намагаюся створити скрипт 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%/}"

Чи може хтось допомогти?

Відповіді:

4 для відповіді № 1

Проблема полягає в тому, що $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 не існує, то ви можете додати a mkdir команда:

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

якщо ви очікуєте цього може не існує, то ви можете додавати його умовно:

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

і якщо ви очікуєте цього робить існує, то у вас є якась налагодження, щоб це зробити!

(До речі, залежно від вашої точної ситуації, ви можете знайти mkdir -p бути корисним. Він рекурсивно створює каталог і всі необхідні батьківські каталоги, і це не означає, що каталог вже існує.)