So erzwingen Sie das Überschreiben nicht leerer Verzeichnisse mit `mv`

17

Ich möchte eine Gruppe von Dateien / Verzeichnissen in ein anderes Verzeichnis verschieben (nicht nur kopieren), von denen einige Namenskonflikte mit Dateien / Verzeichnissen im Zielverzeichnis aufweisen. Mein Hauptziel ist das Verschieben der Dateien, damit ich das Überschreiben des nicht leeren Verzeichnisses tolerieren kann.

Ich benutze derzeit mv ... destinationaber gelegentlich bekomme ich

mv: Ziel kann nicht nach / destination / target verschoben werden: Verzeichnis nicht leer

Ich habe es erfolglos versucht mv -f ... destinationund da ich möchte, dass die Dateien von ihrem ursprünglichen Speicherort entfernt werden, rsyncscheint dies nicht angemessen zu sein.

Gibt es als Bonus eine gute Lösung, um die Dateien zu erhalten, die möglicherweise durch Umbenennen überschrieben werden sollen?

user1227038
quelle
Und welche Fehlermeldung erhalten Sie, wenn Sie Ihren Befehl mv ausführen?
Verdächtiger
Sie sagen ausdrücklich, dass dies rsyncnicht das ist, was Sie wollen. Warum hast du das mit getaggt rsync?
DopeGhoti
@ DopeGhoti Ich sagte, es scheint nicht angemessen, aber ich bin bereit, anders gezeigt zu werden.
user1227038
@suspectus Aktualisierte Frage.
user1227038
1
Wenn Sie use mv --backup=numberedoder eine der anderen Optionen für den --backupSwitch verwenden, mvwird die Zusammenführung abgeschlossen und die zu überschreibenden Dateien bleiben erhalten
bsd

Antworten:

19

Wenn Sie mv --backup=numbered
(oder eine der anderen Optionen für den --backupSwitch),
dann mvwird die Zusammenführung abzuschließen und erhalten die Dateien überschrieben werden soll.

bsd
quelle
dumme Antwort - dies wird Ihr Laufwerk mit .~1~Ordnern verschmutzen
Toolkit
0
#!/bin/bash
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
SRC=/path/to/source
DST=/path/to/destination

for item in $SRC/*; do
    if [[ -f "$DST/$(basename "$item")" ]]; then
        newitem=$(basename $item)_old
        while [[ -f "$DST/$newitem" ]]; do
            newitem=${newitem}_old
        done
        mv "$DST/$(basename $item)" "$DST/$newitem"
    fi
    mv "$item" "$DST/$(basename $item)"
done
DopeGhoti
quelle
1
Anstelle dieses Skripts könnte man auch direkt den cpvom mvKommando gefolgten ausführen .
reza.safiyat
0

Sie können mc(Midnight Commander) im Bildschirm und in den Ordnern mit Insund verwendenF6

Toolkit
quelle