
In diesem Artikel werden einige offensichtliche Dinge im Zusammenhang mit der Nutzung beim Kopieren, das mehrdeutige Verhalten des Befehls cp beim Kopieren sowie Methoden, die es ermöglichen, eine groĂe Anzahl von Dateien ohne Auslassungen und AbstĂŒrze korrekt zu kopieren.
Angenommen, wir mĂŒssen alles aus dem Ordner /source in den Ordner /target kopieren.
Das Erste, was mir einfÀllt, ist:
cp /source/* /targetLassen Sie uns diesen Befehl sofort auf Folgendes korrigieren:
cp -a /source/* /target SchlĂŒssel -a fĂŒgt das Kopieren aller Attribute und Rechte hinzu und aktiviert die Rekursion. Wenn eine genaue Wiederherstellung der Rechte nicht erforderlich ist, genĂŒgt der SchlĂŒssel -r.
Nach dem Kopieren stellen wir fest, dass nicht alle Dateien kopiert wurden â Dateien, die mit einem Punkt beginnen, wurden ignoriert, wie zum Beispiel:
.profil
.lokal
.mc
und Àhnliches.
Warum ist das passiert?
Weil Wildcards vom Shell verarbeitet werden (bash im typischen Fall). StandardmĂ€Ăig ignoriert Bash alle Dateien, die mit Punkten beginnen, da sie als versteckt betrachtet werden. Um dieses Verhalten zu vermeiden, mĂŒssen wir das Verhalten Ă€ndern bash mit dem Befehl:
shopt -s dotglob Damit diese VerhaltensÀnderung nach einem Neustart bestehen bleibt, können wir eine Datei wildcard.sh mit diesem Befehl im Ordner erstellen /etc/profile.d (vielleicht gibt es in Ihrer Distribution einen anderen Ordner).
Wenn im Quellverzeichnis jedoch keine Dateien vorhanden sind, kann das Shell nichts anstelle des Sternchens einsetzen, und das Kopieren endet ebenfalls mit einem Fehler. Gegen eine solche Situation gibt es Optionen failglob und nullglob. Wir mĂŒssen einstellen failglob, die dazu fĂŒhren wird, dass der Befehl nicht ausgefĂŒhrt werden kann. nullglob funktioniert nicht, da sie die Zeile mit nicht ĂŒbereinstimmenden Wildcards in eine leere Zeichenfolge (NulllĂ€nge) umwandelt, was fĂŒr cp einen Fehler verursachen wird.
Wenn jedoch im Ordner Tausende von Dateien und mehr vorhanden sind, sollte man vollstÀndig auf den Ansatz mit Wildcards verzichten. Der Grund ist, dass bash Wildcards in eine sehr lange Befehlszeile wie folgt entfaltet:
cp -a /souce/a /source/b /source/c âŠâŠ /targetEs gibt eine Begrenzung fĂŒr die LĂ€nge der Befehlszeile, die wir mit dem Befehl herausfinden können:
getconf ARG_MAXWir erhalten die maximale LĂ€nge der verwendbaren Befehlszeile in Bytes:
2097152Oder:
xargs --show-limitsWir erhalten etwas wie:
âŠ.
Maximale LÀnge des Befehls, den wir tatsÀchlich verwenden können: 2089314
âŠ.Also lassen Sie uns vollstĂ€ndig auf Wildcards verzichten.
Lassen Sie uns einfach schreiben
cp -a /source /target Und hier stoĂen wir auf die Mehrdeutigkeit des Verhaltens cp. Wenn der Ordner /target nicht existiert, erhalten wir, was wir brauchen.
Wenn der Ordner target jedoch existiert, werden die Dateien in den Ordner /target/source kopiert.
Nicht immer können wir im Voraus den Ordner /target löschen, da darin möglicherweise benötigte Dateien enthalten sind, und unser Ziel könnte zum Beispiel sein, die Dateien in /target mit Dateien aus /source zu ergÀnzen.
Wenn der Quell- und der Zielordner denselben Namen hĂ€tten, zum Beispiel, wenn wir von /source nach /home/source kopieren wĂŒrden, könnte man den Befehl verwenden:
cp -a /source /homeUnd nach dem Kopieren wÀren die Dateien in /home/source mit Dateien aus /source ergÀnzt worden.
So eine logische Aufgabe: Wir können die Dateien im Zielverzeichnis ergÀnzen, wenn die Ordner denselben Namen haben, aber wenn sie unterschiedlich sind, wird der Quellordner im Zielordner abgelegt. Wie kopiert man Dateien von /source nach /target mit cp ohne Wildcards?
Um diese schÀdliche EinschrÀnkung zu umgehen, verwenden wir eine unerwartete Lösung:
cp -a /source/. /targetDiejenigen, die sich gut mit DOS und Linux auskennen, haben bereits alles verstanden: In jedem Ordner gibt es 2 unsichtbare Ordner â.â und â..â, die spezielle Links auf das aktuelle und das ĂŒbergeordnete Verzeichnis sind.
- Beim Kopieren
cpĂŒberprĂŒft es die Existenz und versucht, /target/ zu erstellen. - Ein solches Verzeichnis existiert bereits und das ist /target
- Die Dateien aus /source wurden korrekt in /target kopiert.
Also hÀngen wir uns das in fetten Rahmen in unser GedÀchtnis oder an die Wand:
cp -a /source/. /target
Das Verhalten dieses Befehls ist eindeutig. Alles wird fehlerfrei funktionieren, unabhÀngig davon, ob Sie eine Million Dateien haben oder keine.
Das DBMS Tarantool ist ein attraktives, zukunftstrÀchtiges Produkt zur Erstellung von hochbelasteten Anwendungen.
Wenn Sie Dateien Ressourcen) abgeschlossen ist, lösen wir von einem Ordner in einen anderen kopieren mĂŒssen, verwenden Sie keine Wildcards; stattdessen sollten Sie cp in Kombination mit einem Punkt am Ende des Quellordners verwenden. Das wird alle Dateien, einschlieĂlich versteckter, kopieren und wird bei Millionen von Dateien oder beim völligen Fehlen von Dateien nicht abstĂŒrzen.
Nachwort
schlug eine Àhnliche Befehlsvariante vor:
cp -a -T /source /target
cp -aT /source /target ACHTUNG: Die GroĂ- und Kleinschreibung T ist wichtig. Wenn Sie das verwechseln, bekommen Sie ein völliges Durcheinander: Die Kopierrichtung Ă€ndert sich.
Danksagungen:
- Unternehmen fĂŒr die UnterstĂŒtzung und Möglichkeit zur Veröffentlichung in meinem Blog auf Habr.
- FĂŒr das Bild . Das Bild ist sehr groĂ und detailliert, man kann es in einem separaten Fenster öffnen.
P.S. Bitte Fehler per privater Nachricht melden. Ich erhöhe dafĂŒr die Karma.
Quelle: habr.com
