Simulieren Sie die Aktion des Befehls mv


13

Ich verschiebe einige Dateien und möchte sicherstellen, dass der von mvmir eingegebene Befehl korrekt ist, bevor ich ihn ausführe.

Wenn ich es verwenden würde apt-get, könnte ich das -sFlag verwenden, um eine Simulation durchzuführen, die tatsächlich alles tun würde.

Hat mvdas eine ähnliche Funktion, die das Verschieben der Dateien simuliert aber eigentlich nichts macht?


2
In man mvkann ich nur die -i-Flagge sehen, die vor dem Überschreiben fragt
Kev Inski

2
mvBefehl hat nichts simulate, aber ich kann eine Funktion schreiben, die eine solche Prüfung durchführt. Wie ist diese Lösung?
Sergiy Kolodyazhnyy

2
Und wie soll die Simulation aussehen? Einfaches Drucken einer Zeile pro geänderter Datei, z. B. "a.txt in b, txt umbenannt" oder "/home/you/a.txt in /home/you/Documents/a.txt verschoben"?
Byte Commander

@ByteCommander So ähnlich, ja. Ich bin nur paranoid, weil ich einen Fehler gemacht habe, als ich meine privaten SSL-Zertifikate verschoben habe, um sie zu organisieren.
Starbeamrainbowlabs

4
Die -nOption, um mvsicherzustellen, dass Sie keine Dateien versehentlich überschreiben können, keine Antwort, aber immer nützlich zu wissen.
Arronical

Antworten:


2

Dieses Skript sollte den Trick machen. Es kann auch mehrere Quelldateien / -verzeichnisse verarbeiten. Verwenden Sie es genauso, wie Sie es verwenden würdenmv - mvsim source... dest. Beachten Sie, dass die Optionen nicht beachtet und auch nicht herausgefiltert werden (sie werden nur als Dateinamen behandelt) und dass sie möglicherweise nicht gut mit Symlinks funktionieren.

#!/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

Einige Beispiele:

$ 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.

Vielen Dank! Ich akzeptiere dies als Antwort auf das Skript, das Serg geschrieben hat, da es mehr als zwei Argumente umfasst. maybesieht auch gut aus, aber ich bin der Meinung, dass dies derzeit die sicherere Option ist.
Starbeamrainbowlabs

10

Die unten stehende Funktion dient der ausführlichen Überprüfung mv Syntax. Beachten Sie, dass es nur für die beiden Argumente SOURCE und DESTINATION funktioniert und nicht auf -tFlag überprüft wird .

Die Funktion ist in zu platzieren ~/.bashrc. Um es sofort zu verwenden, öffnen Sie ein neues Terminal oder führen Sie es aussource ~/.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

}

Hier sind einige Testläufe:

$> 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 

1
Sie sollten ay / n hinzufügen, um fortzufahren und die tatsächliche MV aufzurufen. ;)
chaskes

6

Es gibt ein Programm auf Github, das vielleicht heißt das genau das ist, wonach Sie suchen.

Entsprechend ihrer Projektbeschreibung maybe

... ermöglicht es Ihnen, einen Befehl auszuführen und zu sehen, was er mit Ihren Dateien macht, ohne es tatsächlich zu tun! Nachdem Sie die aufgeführten Vorgänge überprüft haben, können Sie entscheiden, ob diese Vorgänge wirklich ausgeführt werden sollen oder nicht.

So können Sie auch sehen, was andere Programme mit Ihren Dateien tun, nicht nur mv .

maybebenötigt Python zum Laufen, aber das sollte kein Problem sein. Es ist einfach, es mit Pythons Paketmanager pip zu installieren oder zu erstellen.

Der Installationsprozess und die Verwendung des Programms sind auf der Homepage des Projekts beschrieben. Leider habe ich im Moment keinen Zugriff auf ein Linux-System, so dass ich Ihnen keine Beispiele zur Verwendung des Programms geben kann.


Wie gut es sich anhört, laut Dokumentation: "Niemals maybenicht vertrauenswürdigen Code ausführen"!
Grooveplex

@grooveplex Vertrauen Sie nicht der Implementierung mvauf Ihrem System?
maddin45

Ja, das tue ich, aber es war als Heads-up
gedacht
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.