#!/bin/bash # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 source "$(dirname "$0")/lib/ulib/ulib" || exit 1 urequire DEFAULTS function display_help() { uecho "$scriptname: déplacer un fichier ou un lien Quand on déplace un lien, la destination du lien est mise à jour USAGE $scriptname files... dest OPTIONS -d UPDATEDIR Chercher dans UPDATEDIR tous les liens qui pointent vers le fichier déplacé, et mettre à jour ces liens après avoir déplacé le fichier" } args=(--help '$exit_with display_help' -d:,--updatedir: .) parse_args "$@"; set -- "${args[@]}" if [ $# -eq 0 ]; then die "Vous devez spécifier les fichiers à déplacer" elif [ $# -eq 1 ]; then die "Vous devez spécifier la destination" fi [ -z "$updatedir" -o -d "$updatedir" ] || die "$updatedir: doit être un répertoire" 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 die "$dest: refus d'écraser la destination" else src="${srcs[0]}" if [ -n "$updatedir" ]; then if [ -L "$src" ]; then link="$src" linkdir="$(dirname -- "$link")" ldest="$(abspath "$(readlink "$link")" "$linkdir")" 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 exit $? fi fi # S'il y a plus de deux arguments, il FAUT que dest soit un répertoire [ -d "$dest" ] || die "$dest: doit être un répertoire" 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