Simuler l'action de la commande mv

13

Je déplace des fichiers et je veux m'assurer que la mvcommande que j'ai tapée est correcte avant de continuer et de l'exécuter.

Si j'utilisais apt-get, je pourrais utiliser le -sdrapeau pour effectuer une simulation qui ferait n'importe quoi.

A mvune fonction similaire, qui simulerait le déplacement des fichiers mais ne ferait rien en fait?

starbeamrainbowlabs
la source
2
Dans man mvje ne peux voir que le -i-flag, qui demande avant d'écraser
Kev Inski
2
mvla commande n'a simulaterien, mais je peux écrire une fonction qui fait une vérification comme ça. Comment est cette solution?
Sergiy Kolodyazhnyy
2
Et à quoi pensez-vous que la simulation ressemblera? SImprimer simplement une ligne par fichier modifié, en indiquant par exemple "Renommé a.txt en b, txt" ou "Déplacé /home/you/a.txt en /home/you/Documents/a.txt"?
Byte Commander
@ByteCommander Quelque chose comme ça, oui. Je suis juste paranoïaque de faire une erreur en déplaçant mes certificats SSL privés pour les organiser.
starbeamrainbowlabs
4
L' -noption pour mvvous assurera que vous ne pouvez pas écraser des fichiers par erreur, pas une réponse mais toujours utile à savoir.
Arronical

Réponses:

2

Ce script devrait faire l'affaire. Il peut également gérer plusieurs fichiers / répertoires sources. Utilisez-le de la même manière que vous utiliseriez mv- mvsim source... dest. Notez qu'il ne prête pas attention aux options, ni les filtre (il les traite simplement comme des noms de fichiers) et il peut ne pas fonctionner correctement avec les liens symboliques.

#!/bin/bash

if [ $# -lt 2 ]; then
    echo "Too few arguments given; at least 2 arguments are needed."
    exit 1
fi

lastArg="${@:$#}"

i=1
for param in "$@"; do
    if [ ! -e "$param" -a $i -lt $# ]; then
        echo "Error: $param does not exist."
        exit 1
    elif [ "$param" = "$lastArg" -a $i -lt $# ]; then
        echo "Error: $param is the same file/directory as the destination."
        exit 1
    fi
    ((i++))
done

if [ $# -eq 2 ]; then # special case for 2 arguments to make output look better
    if [ -d "$1" ]; then
        if [ -d "$2" ]; then
            echo "Moves directory $1 (and anything inside it) into directory $2"
            exit 0
        elif [ ! -e "$2" ]; then
            echo "Renames directory $1 to $2"
            exit 0
        else
            echo "Error: $2 is not a directory; mv cannot overwrite a non-directory with a directory."
            exit 1
        fi
    else
        if [ -d "$2" ]; then
            echo "Moves file $1 into directory $2"
        elif [ -e "$2" ]; then
            echo "Renames file $1 to $2, replacing file $2"
        else
            echo "Renames file $1 to $2"
        fi
        exit 0
    fi
elif [ ! -e "$lastArg" ]; then
    echo "Error: $lastArg does not exist."
    exit 1
elif [ ! -d "$lastArg" ]; then
    echo "Error: $lastArg is not a directory; mv cannot merge multiple files into one."
    exit 1
fi

argsLeft=$#
echo "Moves..."
for param in  "$@"; do
    if [ $argsLeft -eq 1 ]; then
        echo "...Into the directory $param" # has to be a directory because -f $lastArg was dealt with earlier
        exit 0
    fi
    if [ -d "$param" ]; then
        if [ ! -d "$lastArg" ]; then
            echo "Error: $lastArg is not a directory; mv cannot overwrite a non-directory with a directory."
            exit 1
        fi
        if [ $argsLeft -eq $# ]; then
            echo "The directory ${param} (and anything inside it)..."
        else
            echo "And the directory ${param} (and anything inside it)..."
        fi
    else
        if [ $argsLeft -eq $# ]; then
            echo "The file ${param}..."
        else
            echo "And the file ${param}..."
        fi
    fi
    ((argsLeft--))
done

Quelques exemples:

$ ls
dir1  dir2  file1  file2  file3  mvsim
$ ./mvsim file1 file2
Renames file file1 to file2, replacing file file2
$ ./mvsim file1 newfile
Renames file file1 to newfile
$ ./mvsim file1 dir1
Moves file file1 into the directory dir1
$ ./mvsim file1 file2 file3 dir1
Moves...
The file file1...
And the file file2...
And the file file3...
...Into the directory dir1
$ ./mvsim file1 file2 dir1 dir2
Moves...
The file file1...
And the file file2...
And the directory dir1 (and anything inside it)...
...Into the directory dir2
$ ./mvsim file1 file2 file3 # error - file3 isn't a directory
Error: file3 is not a directory; mv cannot merge multiple files into one.
$ ./mvsim -f -i file1 dir1 # options aren't parsed or filtered out
Error: -f does not exist.
insert_name_here
la source
Merci! J'accepte cela comme la réponse au script que Serg a écrit car il couvre plus de 2 arguments. maybesemble bien aussi, mais je pense que c'est l'option la plus sûre pour le moment.
starbeamrainbowlabs
10

La fonction ci-dessous sert à vérifier verbalement la mvsyntaxe. Notez qu'il ne fonctionne que pour 2 arguments, SOURCE et DESTINATION, et ne vérifie pas l' -tindicateur.

La fonction doit être placée dans ~/.bashrc. Pour l'utiliser immédiatement, ouvrez un nouveau terminal ou exécutezsource ~/.bashrc

mv_check()
{
    # Function for checking syntax of mv command 
    # sort of verbose dry run
    # NOTE !!! this doesn't support the -t flag
    # maybe it will in future (?)

    # check number of arguments  
    if [ $# -ne 2   ]; then
        echo "<<< ERROR: must have 2 arguments , but $# given "
        return 1
    fi

    # check if source item exist
    if ! readlink -e "$1" > /dev/null 
    then
        echo "<<< ERROR: " "$item" " doesn't exist"
        return 1
    fi

    # check where file goes

    if [ -d "$2"  ]
    then
        echo "Moving " "$1" " into " "$2" " directory"
    else
        echo "Renaming "  "$1" " to " "$2" 
    fi

}

Voici quelques essais:

$> mv_check  TEST_FILE1  bin/python                                                                                      
Moving  TEST_FILE1  into  bin/python  directory
$> mv_check  TEST_FILE1  TEST_FILE2                                                                                      
Renaming  TEST_FILE1  to  TEST_FILE2
$> mv_check  TEST_FILE1  TEST_FILE 2                                                                                     
<<< ERROR: must have 2 arguments , but 3 given 
$> mv_check  TEST_FILE1  TEST_FILE\ 2                                                                                    
Renaming  TEST_FILE1  to  TEST_FILE 2
$> mv_check  TEST_FILE1  "TEST_FILE 2"                                                                                   
Renaming  TEST_FILE1  to  TEST_FILE 2
$> mv_check  TEST_FILE1                                                                                                  
<<< ERROR: must have 2 arguments , but 1 given 
Sergiy Kolodyazhnyy
la source
1
Vous devez ajouter ay / n pour continuer et appeler le mv réel. ;)
chasse le
6

Il y a un programm sur github appelé peut - être ce qui peut être ce que vous recherchez.

Selon leur description de projet, maybe

... vous permet d'exécuter une commande et de voir ce qu'elle fait sur vos fichiers sans le faire! Après avoir examiné les opérations répertoriées, vous pouvez alors décider si vous voulez vraiment que ces choses se produisent ou non.

Ainsi, il vous montrera également ce que d'autres programmes feront à vos fichiers, pas seulement mv.

maybea besoin de Python pour fonctionner, mais cela ne devrait pas être un problème. Il est facile à installer ou à construire à l'aide du gestionnaire de paquets Python pip.

Le processus d'installation et l'utilisation du programme sont tous deux décrits sur la page d'accueil du projet. Malheureusement, je n'ai pas accès à un système Linux pour le moment, je ne peux donc pas vous fournir d'exemples sur l'utilisation du programme.

maddin45
la source
Comme tout sonne bien, selon la documentation: "ne jamais utiliser maybepour exécuter du code non fiable"!
grooveplex
@grooveplex Vous ne faites pas confiance à l'implémentation de mvsur votre système?
maddin45
oui, je le pense, mais c'était un heads-up
grooveplex