Ich habe eine Menge Dateien und Verzeichnisse in einem Unterverzeichnis, das ich in das übergeordnete Verzeichnis verschieben möchte. Es gibt bereits einige Dateien und Verzeichnisse im Zielverzeichnis, die überschrieben werden müssen. Dateien, die nur im Ziel vorhanden sind, sollten nicht verändert werden. Kann ich das erzwingen mv
? Es ( mv * ..
) beschwert sich
mv: cannot move `xyz' to `../xyz': Directory not empty
Was vermisse ich?
shell
command-line
rename
EricSchaefer
quelle
quelle
mv -f
?mv -f
nicht die richtige Antwort ist.Antworten:
Sie haben sie zum Ziel kopieren und dann die Quelle löschen, mit den Befehlen
cp -r * ..
gefolgt vonrm -rf *
.Ich glaube nicht, dass Sie Verzeichnisse mit "zusammenführen" können
mv
.quelle
mv
ist es schneller, weil Sie sich im selben Dateisystem befinden? Was ist, wenn Siecp -l
Hardlinks erstellen, anstatt die Dateien tatsächlich zu verschieben?cp -a
stattcp -r
verwenden, um die Dateiattribute (Zeitstempel, Berechtigungen usw.) beizubehalten.cp -rl source destination && rm -r source
.rsync
wäre wahrscheinlich eine bessere Option hier. Es ist so einfach wiersync -a subdir/ ./
.Mein Testbaum in
filename
:contents
Format:Laufen
rsync
:Gibt:
Und dann, um zu emulieren
mv
, möchten Sie wahrscheinlich das Quellverzeichnis entfernen:Geben:
Wenn dies falsch ist, können Sie bitte ein ähnliches Beispiel (z. B. mithilfe meines Testbaums oben in dieser Antwort) mit dem gewünschten Ergebnis angeben?
quelle
rm -r
am Ende hinzugefügt , um es im Grunde das gleiche wie zu machenmv
.mv
Ist atomar, behält Inode-Nummern bei (sodass die Datei geöffnet bleiben kann) und benötigt keine Zeit und keinen Platz, um eine Kopie zu erstellen.cp -r; rm -r
. Ich denke in diesem Sinnersync
ist es auch erwähnenswert.rsync
kann die Quelle nach dem Kopieren mit dem--remove-source-files
Parameter löschen . Dies sollte eine bequeme Möglichkeit sein, das zu tun, was Sie möchten.Aus dem
rsync man page
:quelle
cp -r; rm
wegen des Mangels an freiem Speicherplatz nicht verwenden . Stattdessen habenrsync --remove-source-files
beide das Kopieren über exakt die gleichen Dateien vermieden und den belegten Speicherplatz minimiert.Sie können dies mit
cp
und tunrm
, aber ohne die enorme Datenmenge zu kopieren, die Sie (vermutlich) vermeiden möchten, zu übertragen. @mattdm spielte in seinem Kommentar darauf an , und eine Antwort auf eine andere Frage enthält eine ausführlichere Diskussion über verschiedene Optionen.Im Wesentlichen erstellt die
-l
Option für dencp
Befehl feste Verknüpfungen zu Dateien, anstatt deren Daten in neue Dateien zu kopieren.quelle
cp -al source destination
um die Informationen und Berechtigungen des Besitzers zu erhalten.cp
wird standardmäßig überschrieben. Die-f
Option versucht, die Datei (wie inrm
) vor dem erneuten Kopieren zu entfernen. Dies kann hilfreich sein, wenn der Prozess die Datei nicht zum Schreiben öffnen kann. Einige Benutzer möchten jedoch lieber feststellen, dass stattdessen ein Fehler aufgetreten ist. Ich weiß nicht, ob es für das OP von Bedeutung ist, aber ich-f
habe meiner Antwort trotzdem die Flagge hinzugefügt .Hier ist ein Skript, das Dateien von unten
/path/to/source/root
in den entsprechenden Pfad unter verschiebt/path/to/destination/root
.Vorsicht, ungetesteter Code.
quelle
\;
vor dem-o
in der ersten Zeile desfind
Befehls, und Sie sollten nicht!
in derif
- es ist nur!
nicht\!
Dieser Thread ist seit Jahren da draußen und rangiert immer noch auf Platz 1 bei Google, also wollte ich eine andere Methode hinzufügen. So mache ich das normalerweise: Packe den Inhalt des Unterverzeichnisses in ein Tarball, verschiebe das Tarball in das übergeordnete Verzeichnis und extrahiere es dann mit dem Standardverhalten --overwrite. Das macht genau das, wonach Sie suchen. Anschließend können Sie Ihr Unterverzeichnis entfernen.
quelle
Wenn Sie über genügend Speicherplatz verfügen, können Sie dies folgendermaßen tun:
Vergewissern Sie sich, dass keine wichtigen Dateien mit einem ~ am Ende versehen sind, aber falls vorhanden, können Sie
--suffix=whateveryouwant
anstelle der Standarddatei hinzufügen .quelle