Ich habe zwei Verzeichnisbäume mit ähnlichen Layouts, dh
.
|-- dir1
| |-- a
| | |-- file1.txt
| | `-- file2.txt
| |-- b
| | `-- file3.txt
| `-- c
| `-- file4.txt
`-- dir2
|-- a
| |-- file5.txt
| `-- file6.txt
|-- b
| |-- file7.txt
| `-- file8.txt
`-- c
|-- file10.txt
`-- file9.txt
Ich möchte die Verzeichnisbäume dir1 und dir2 zusammenführen, um Folgendes zu erstellen:
merged/
|-- a
| |-- file1.txt
| |-- file2.txt
| |-- file5.txt
| `-- file6.txt
|-- b
| |-- file3.txt
| |-- file7.txt
| `-- file8.txt
`-- c
|-- file10.txt
|-- file4.txt
`-- file9.txt
Ich weiß, dass ich dies mit dem Befehl "cp" tun kann, aber ich möchte die Dateien verschieben, anstatt sie zu kopieren, da die tatsächlichen Verzeichnisse, die ich zusammenführen möchte, sehr groß sind und viele Dateien (Millionen) enthalten. Wenn ich "mv" verwende, erhalte ich den Fehler "Datei existiert", weil in Konflikt stehende Verzeichnisnamen vorliegen.
UPDATE: Sie können davon ausgehen, dass sich zwischen den beiden Verzeichnisbäumen keine doppelten Dateien befinden.
Antworten:
Dadurch würden Hardlinks erstellt, anstatt sie zu verschieben. Sie können überprüfen, ob sie ordnungsgemäß verschoben wurden. Entfernen Sie dann
dir1/
unddir2/
.quelle
--link-dest
Pfad absolut oder relativ zumerged/
; oder es wird kopiert.Es ist seltsam, dass niemand bemerkt
cp
hat , dass es eine Option gibt-l
:Sie können so etwas tun
quelle
cp -l
funktioniert dies nicht systemübergreifend.cp -a
(synonym zucp -RPp
) verwenden, um alle Attribute der Dateien beizubehalten und folgende Symlinks zu vermeiden: Hier wird der Befehlcp -al dir1/* dir2/* merge
.Sie können dafür Rename (aka prename, aus dem Perl-Paket) verwenden. Beachten Sie, dass der Name nicht unbedingt auf den Befehl verweist, den ich außerhalb von debian / ubuntu beschreibe (obwohl es sich um eine einzelne portable Perl-Datei handelt, wenn Sie sie benötigen).
Sie haben auch die Möglichkeit, vidir (aus moreutils) zu verwenden und die Dateipfade in Ihrem bevorzugten Texteditor zu bearbeiten.
quelle
Ich mag die Lösungen rsync und prename , aber wenn Sie wirklich wollen, dass mv die Arbeit macht und
-print0
und-depth
,-0
,Dann ist es möglich, eine große Anzahl von Dateien mit zufälligen Leerzeichen im Namen zu verarbeiten, und zwar alle mit einem Shell-Skript im Bourne-Stil:
quelle
find . -name '*.torrent' | xargs -d '\n' rm
Rohe Gewalt
bash
Test macht das
quelle
Ich musste dies mehrmals für Quellcodebäume in verschiedenen Entwicklungsstadien tun. Meine Lösung bestand darin, Git folgendermaßen zu verwenden:
Sie können es mit Verzweigungen und so weiter verfeinern, aber dies ist die allgemeine Idee. Und Sie haben weniger Angst davor, es zu stopfen, weil Sie eine vollständige Momentaufnahme jedes Zustands haben.
quelle