Ich habe alle Dateien aus einem Verzeichnis mit verschoben mv
und versehentlich einen Tippfehler im Zielspeicherort gemacht.
Das System hat die Meldung zurückgegeben, dass das Verzeichnis nicht vorhanden ist, meine Dateien aus dem Quellverzeichnis jedoch gelöscht wurden.
Ist das ein Fehler? Sollte das Verschieben von Dateien an einen nicht vorhandenen Speicherort die zu verschiebenden Dateien löschen? (Dies ist unter Ubuntu 18.04.2 LTS.)
Die Besonderheiten waren:
- Erstellte
test.txt
Datei. - Verschob die Datei nach
/ben
mitsudo
. - Die Datei ist verschwunden.
/ben
ist nicht vorhanden.
Die Befehle und Ausgaben waren:
ben.b@c-w46:~/Desktop/test-folder$ sudo mv test.txt /ben
ben.b@c-w46:~/Desktop/test-folder$ cd /ben
bash: cd: /ben: Not a directory
command-line
files
mv
ben berizovsky
quelle
quelle
test.txt
,/ben
ist also in der Tat/ben
kein Verzeichnis (es ist das neuefile.txt
).mv
funktioniert es./
, as zu/ben
. Sie können es beispielsweise zurückschieben. Ich habe eine Antwort zu diesem und dem allgemeineren Thema gepostet.Antworten:
In dem Befehl, den Sie tatsächlich ausgeführt haben, haben Sie nichts verloren! Es gelang, umzubenennen
test.txt
in/ben
. Angenommen,test.txt
es handelt sich um eine reguläre Datei, ebenso wie die neue/ben
(schließlich handelt es sich um dieselbe Datei).Der Grund, den Sie sehen,
bash: cd: /ben: Not a directory
ist, was auf der Dose steht:/ben
ist kein Verzeichnis. Sie können weiterhin auf die Datei zugreifen.Wenn Sie diese Art von Fehler vermeiden und einen Fehler erzwingen möchten,
mv
wenn das Ziel kein Verzeichnis ist, schreiben Sie ein Trailing/
darauf oder verwenden Sie-t dir
. Zum Beispiel hätte eines dieser Probleme das (sehr geringfügige!) Problem verhindert, das Sie (beisudo
Bedarf) hatten:Informationen über die in Ihrer Frage beschriebene allgemeine Situation - über den Verlust von Dateien durch den Versuch, sie zu verschieben - und darüber, was schief gehen kann und was nicht, folgen.
Wie Rinzwind sagt , sollte das Verschieben von Dateien in ein nicht vorhandenes Zielverzeichnis keinen Datenverlust verursachen, wenn Sie es mit einem einzigen
mv
Befehl versuchen . Es kann jedoch vorkommen, dass Siemv
mehr als einmal ausgeführt haben, z. B. in einer Shell-Schleife.Angenommen, ich habe:
Um all diese Dateien zu verschieben
dest
, sollte ich alle ihre Namenmv
in einem Befehl wiemv file*.txt dest/
oder übergebenmv file*.txt dest
. In beiden Fällen - das heißt, ob ich den Namen des Zielverzeichnisses mit einem abschließenden Schrägstrich schreibe oder nicht - ist dies das Richtige. In beiden Fällen wirddst
eine Fehlermeldung angezeigt, wenn ich den Namen des Zielverzeichnisses falsch schreibe (z. B. durch Schreiben ),mv: target 'dst' is not a directory
und es gehen keine Daten verloren.Angenommen, ich würde falsch
dst
schreiben, das Trailing weglassen/
und mehreremv
Befehle ausführen. Das wäre schlecht, denn wenn das Ziel vonmv
eine reguläre Datei ist,mv
ersetzt es diese!Aus diesem Grund bevorzugen viele Leute immer schreiben Zielverzeichnisse mit einem nachgestellten
/
inmv
:Sie können verwenden
mv -i
, um Sie vor dem Überschreiben zu fragen odermv -n
um stillschweigend nicht zu überschreiben. Andernfallsmv
fragen Sie vor dem Überschreiben nur, ob das Ziel eine schreibgeschützte Datei ist. Ein Grund, dies in Betracht zu ziehen, besteht darin, dass es andere Fälle abdeckt, z. B.mv file01.txt dest/
wenn Sie nicht bemerkt haben, dass esdest/file01.txt
existiert und Sie es nicht überschreiben wollten.Sie können auch verwenden,
-t dest
anstattdest
am Ende des Befehls zu schreiben , zmv -t dest file*.txt
. Dies verweigert den Betrieb, wenndest
es sich um eine reguläre Datei handelt, unabhängig davon, ob Sie ein Trailing schreiben oder nicht/
.Die Verwendung eines automatisierten Mechanismus zum Ausführen mehrerer solcher Befehle kann das Problem erheblich verschärfen. Zum Beispiel ist der Befehl , wie geschrieben,
for f in file*.txt; do mv "$f" dest/; done
unnötig kompliziert, aber sicher, denn wenn ich versehentlich die Dateidst
anstelle des Verzeichnisses spezifizieredest
(aber den Schrägstrich behalte!), Würde ich einenmv: failed to access 'dst/': Not a directory
Fehler pro Datei erhalten. Wenn ich jedoch den nachgestellten weggelassen/
, dann wäre es jede Datei umbenennendst
, ersetzt die vorherigedst
, und nur die letzte Datei bleiben würde.Ähnliche schlechte Ergebnisse können erzielt werden
find
, auch in Situationen, in denen die Verwendung sinnvoll sein kannfind
(jedoch anders und dennoch mit besonderer Sorgfalt). Angenommen, ich wollte alle Dateien, die mit dem Globfile*.txt
in einem gesamten Verzeichnisbaum übereinstimmen ( außer andest
sich ), in das Verzeichnis verschiebendest
. Ich könnte zuerst darüber nachdenken, dies zu verwenden:Da ich ein abschließendes
/
Schreibendest/
anstelle von eingefügt habe ,dest
würde dies eine aufgerufene Datei nicht überschreiben,dst
selbst wenn ichdst
stattdessen schreiben würdedest
. Es besteht jedoch das Problem, dass bereits kopierte Dateien überschrieben werden, wenn Dateien in verschiedenen Teilen des Verzeichnisbaums denselben Namen haben. Wenn es zum Beispiel eina/file01.txt
und ein gibtb/file01.txt
, überschreibt eines das andere. Um dies ebenfalls zu vermeiden, ist es besser, so etwas zu verwenden:Der andere Vorteil
-t dir
besteht darin, dass Sie das Zielverzeichnis angeben können, bevor die Elemente verschoben werden. Es ist daher mit der+
Form kompatibel-exec
, bei der mehrere Elemente an einen Befehl übergeben werden, wodurch weniger Befehle ausgeführt werden (häufig nur einer):In beiden Fällen (sie sind bis auf
\;
vs. gleich+
) habe ich auch die-i
Option übergeben, vor jedem Vorgang, der eine Datei überschreiben würde, eine Eingabeaufforderung zu erhalten. Wenn Sie diese nur stillschweigend überspringen möchten, schreiben Sien
statti
. Wenn Sie Ihrefind
Befehle zuerst testen möchten , können Sieecho
nach,-exec
aber vor dem Rest des Befehls schreiben , um zu drucken, was ausgeführt werden soll. Zum Beispiel:(Natürlich befindet sich das in dem Originalverzeichnis, das ich gezeigt habe, wo sich alle zu verschiebenden Dateien am selben Speicherort befinden und wo
find
es sich um Overkill handelt und der komplizierteste vernünftige Befehl istmv -it dest/ file*.txt
.)quelle
Nein, was Sie vorschlagen, sollte (!) Nicht möglich sein. Sie müssen wahrscheinlich am Ziel besser aussehen. Verwenden Sie
history
diese Option , um eine Liste der zuvor ausgegebenen Befehle abzurufen.Einige Sachen:
Wenn ein Schritt getan wird ...
Informationen zur Funktionsweise von mv und insbesondere zu diesem Teil finden Sie unter
info coreutils 'mv invocation'
(Online-Version https://www.gnu.org/software/coreutils/manual/html_node/mv-invocation.html#mv-invocation ).Ein Zug besteht also aus 2 Teilen:
cp -a
mv
Der Entfernungsteil des Verschiebens ist abgeschlossen, nachdem bestätigt wurde, dass die Kopie korrekt ausgeführt wurde.
Wenn Ihre MV aus mehreren Dateien besteht, erfolgt das Kopieren und Verschieben dazwischen. Also a
werde ein tun
Wenn es also ein Problem zwischen a und f gibt, ist die Bewegung von a und bis zu dem Punkt, an dem das Problem aufgetreten ist, beendet. Dies gilt auch für die Verwendung von Platzhaltern.
In Bezug auf die Bearbeitung
Dadurch wird test.txt nach / verschoben und in ben umbenannt. Und
richtig fehler raus. Mach a
und es wird die Datei anzeigen.
Was Sie immer tun sollten, ist ein / anzuhängen, wenn Sie eine Datei in ein Verzeichnis verschieben möchten.
würde ausfallen, da / ben / nicht existiert.
quelle