Я намагаюся створити скрипт 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
бути корисним. Він рекурсивно створює каталог і всі необхідні батьківські каталоги, і це не означає, що каталог вже існує.)