Ich habe ein großes Verzeichnis mit Unterverzeichnissen und Dateien, die ich rekursiv kopieren möchte.
Gibt es eine Möglichkeit, anzugeben, cp
dass der Kopiervorgang in der Reihenfolge der Dateigröße ausgeführt werden soll, damit die kleinsten Dateien zuerst kopiert werden?
Antworten:
Dies erledigt den gesamten Job auf einmal - in allen untergeordneten Verzeichnissen, alle in einem einzigen Stream ohne Dateinamenprobleme. Jede Datei, die Sie haben, wird vom kleinsten zum größten kopiert. Sie müssen,
mkdir ${DESTINATION}
wenn es noch nicht existiert.Weißt du was? Was dies nicht tut, sind leere untergeordnete Verzeichnisse. Ich könnte eine Umleitung über diese Pipeline vornehmen, aber es ist nur eine Rennbedingung, die darauf wartet, dass sie eintritt. Am einfachsten ist es wahrscheinlich am besten. Also mach das einfach nachher:
Oder ich sollte es auch versuchen, da Gilles in seiner Antwort auf die Beibehaltung von Verzeichnisberechtigungen einen sehr guten Standpunkt vertritt. Ich denke das wird es schaffen:
Ich wäre bereit zu wetten, dass das schneller ist als überhaupt
mkdir
.quelle
Hier ist eine schnelle und schmutzige Methode mit
rsync
. In diesem Beispiel halte ich alles unter 10 MB für "klein".Übertragen Sie zunächst nur die kleinen Dateien:
rsync -a --max-size=10m srcdir dstdir
Übertragen Sie dann die restlichen Dateien. Die zuvor übertragenen kleinen Dateien werden erst dann erneut kopiert, wenn sie geändert wurden.
rsync -a srcdir dstdir
Von
man 1 rsync
Natürlich ist die Reihenfolge der Übertragung von Datei zu Datei nicht unbedingt die kleinste bis größte, aber ich denke, es ist die einfachste Lösung, die dem Geist Ihrer Anforderungen entspricht.
quelle
--copy-dest=DIR
und / oder--compare-dest=DIR
ich denke. Ich weiß es nur, weil ich--hard-dereference
mich selbst hinzufügen musste ,tar
nachdem ich meine eigene Antwort gepostet hatte, weil mir die Links fehlten. Ich denke,rsync
tatsächlich verhält es sich sowieso spezifischer für lokale Dateisysteme als für diese anderen - ich habe es früher mit USB-Sticks verwendet und es würde den Bus überfluten, wenn ich kein Bandbreitenlimit festlege. Ich denke, ich hätte stattdessen einen dieser anderen verwenden sollen.Nicht
cp
direkt, das geht weit über seine Fähigkeiten hinaus. Sie könnencp
die Dateien jedoch in der richtigen Reihenfolge aufrufen .Mit Zsh können Sie Dateien bequem mit einem Glob-Qualifier nach Größe sortieren . Hier ist ein zsh-Snippet, das Dateien in aufsteigender Reihenfolge von unter
/path/to/source-directory
nach unter kopiert/path/to/destination-directory
.Anstelle einer Schleife können Sie die
zcp
Funktion verwenden. Sie müssen jedoch zuerst die Zielverzeichnisse erstellen, was in einem kryptischen Oneliner erfolgen kann.Dadurch bleibt der Besitz der Quellverzeichnisse nicht erhalten. Wenn Sie das möchten, müssen Sie ein geeignetes Kopierprogramm wie
cpio
oder eintragenpax
. Wenn Sie das tun, müssen Sie nicht anrufencp
oderzcp
zusätzlich.quelle
Ich glaube nicht, dass es eine Möglichkeit gibt,
cp -r
dies direkt zu tun. Da es eine unbestimmte Zeit dauern kann, bis Sie eine Wizardfind
/awk
Lösung erhalten, folgt ein kurzes Perl-Skript:Benutze das:
./whatever.pl /src/path /dest/path
Die Argumente sollten beide absolute Pfade sein ;
~
, oder alles andere, was die Shell zu einem absoluten Pfad erweitert, ist in Ordnung.Wenn Sie ein drittes Argument (außer einem Literal
0
) hinzufügen , wird anstelle des Kopierens ein Bericht mit vorangestellten Dateigrößen in Bytes ausgegeben, zBeachten Sie, dass diese nach Größe aufsteigend sortiert sind.
Der
cp
Befehl in Zeile 34 ist ein wörtlicher Shell-Befehl, sodass Sie mit den Schaltern alles tun können, was Sie wollen (ich habe gerade-a
alle Merkmale beibehalten).File::Find
undFile::Basename
sind beide Kernmodule, dh sie sind in allen Installationen von Perl verfügbar.quelle
cp - copy smallest files first?
aber der Titel des Beitrags ist auf jedencopy smallest files first?
Fall, Optionen, die nie schaden, sind meine Philosophie, aber trotzdem sind Sie und David die einzigen, die verwendet werdencp
und Sie sind die einzigen, die es geschafft haben.cp
war, dass es der einfachste Weg ist, * nix-Dateieigenschaften in der (plattformübergreifenden) Perl zu erhalten. Der Grund, den Ihre Browserleiste angibt,cp -
ist eine (IMO goofy) SE-Funktion, bei der das beliebteste der ausgewählten Tags vor dem eigentlichen Titel angezeigt wird.pearl
hier nicht oft Holzarbeiten.Eine andere Möglichkeit wäre, cp mit der Ausgabe von du zu verwenden:
Dies könnte immer noch in einer Zeile geschehen, aber ich habe es aufgeteilt, damit Sie es lesen können
quelle