From 429f246946026ef3a82ab253325f9511fdc64cf1 Mon Sep 17 00:00:00 2001 From: Jephte CLAIN Date: Sun, 21 Dec 2014 13:41:13 +0400 Subject: [PATCH] script umove qui est un frontend pour les fonction move_* --- umove | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100755 umove diff --git a/umove b/umove new file mode 100755 index 0000000..b06cdaf --- /dev/null +++ b/umove @@ -0,0 +1,74 @@ +#!/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