/ / Bash: przenieś plik / katalog i utwórz jego link - linux, bash, shell, move, symlink

Bash: przenieś plik / katalog i utwórz jego link - linux, bash, shell, move, symlink

Próbuję utworzyć skrypt bash, który przenosi plik lub katalog z katalogu źródłowego do katalogu docelowego i umieszcza dowiązanie symboliczne w katalogu źródłowym.

Więc, <source_path> może być plikiem lub katalogiem, <destination_dir_path> jest katalogiem, w którym chcę przenieść oryginał.

Przykładowe użycie:

$ mvln /source_dir/file.txt /destination_dir/
OR
$ mvln /source_dir/dir_I_want_to_move/ /destination_dir/

To właśnie udało mi się połączyć, ale nie działa poprawnie. Działa tylko wtedy, gdy źródłem jest katalog, w przeciwnym razie mv zwraca błąd:

mv: unable to rename `/source_dir/some_file.txt": Not a directory

Katalog nie jest przenoszony do katalogu destination_directory, ale przenoszona jest tylko jego zawartość.

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

Czy ktoś może Ci pomóc?

Odpowiedzi:

4 dla odpowiedzi № 1

Problemem jest $destination_path odnosi się do katalogu, który nie istnieje. Coś takiego:

mv /path/to/file.txt /path/to/non/existent/directory/

zwraca błąd, i

mv /path/to/directory/ /path/to/non/existent/directory/

zmieni nazwę /path/to/directory/ do /path/to/non/existent/directory/ (pod warunkiem że /path/to/non/existent/ jest istniejącym katalogiem, tylko bez podfolderu o nazwie directory).

Jeśli tego oczekujesz $destination_path już nie istnieje, możesz dodać mkdir dowództwo:

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

jeśli spodziewasz się tego moc nie istnieje, możesz dodać to warunkowo:

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

i jeśli się tego spodziewasz robi istnieje, musisz przeprowadzić debugowanie!

(Nawiasem mówiąc, w zależności od twojej dokładnej sytuacji, możesz znaleźć mkdir -p być pomocnym. Rekursywnie tworzy katalog i wszystkie niezbędne katalogi nadrzędne i nie ma to znaczenia, jeśli katalog już istnieje.)