##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ## Fonctions de base: outils divers ##@cooked nocomments ##@include base uprovide base.tools urequire base function base_umove() { # Outil de haut niveau pour déplacer un fichier ou un lien. Si c'est un lien qui # est déplacé, la destination du lien est mise à jour si elle est relative. # l'option '-d UPDATEDIR' permet de spécifier un répertoire dans lequel tous les # liens qui pointent vers le fichier déplacé sont mis à jour si le déplacement # du fichier se fait avec succès. local -a args local updatedir args=(-d:,--updatedir: .) parse_args_check "$@" && set -- "${args[@]}" || return eerror_unless [ -z "$updatedir" -o -d "$updatedir" ] "$updatedir: doit être un répertoire" || return eerror_if [ $# -eq 0 ] "Vous devez spécifier les fichiers à déplacer" || return eerror_if [ $# -eq 1 ] "Vous devez spécifier la destination" || return local -a srcs local dest srcs=("$@") setx dest=last_value srcs array_del_last srcs if [ $# -eq 2 ]; then # S'il n'y a que deux arguments, permettre que le deuxième argument ne # soit pas un répertoire if [ -d "$dest" ]; then : # ce cas sera traité ci-dessous elif [ -e "$dest" ]; then eerror "$dest: refus d'écraser la destination" return 1 else src="${srcs[0]}" if [ -n "$updatedir" ]; then if [ -L "$src" ]; then ldest="$(readlinka "$src")" array_find_links update_links "$ldest" "$updatedir" else array_find_links update_links "$src" "$updatedir" fi move_file "$src" "$dest" "${update_links[@]}" else move_link "$src" "$dest" fi return $? fi fi # S'il y a plus de deux arguments, il FAUT que dest soit un répertoire [ -d "$dest" ] || { eerror "$dest: doit être un répertoire" return 1 } for src in "${srcs[@]}"; do if [ -n "$updatedir" ]; then if [ -L "$src" ]; then move_link "$src" "$dest" else array_find_links update_links "$src" "$updatedir" move_file "$src" "$dest" "${update_links[@]}" fi else move_link "$src" "$dest" fi done }