Das cp-Team: korrektes Kopieren von Ordnern mit Dateien in *nix

Das cp-Team: korrektes Kopieren von Ordnern mit Dateien in *nix

In diesem Artikel werden einige offensichtliche Dinge im Zusammenhang mit der Nutzung wildcards 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/* /target

Lassen 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 

 /target

Es gibt eine Begrenzung fĂŒr die LĂ€nge der Befehlszeile, die wir mit dem Befehl herausfinden können:

getconf ARG_MAX

Wir erhalten die maximale LĂ€nge der verwendbaren Befehlszeile in Bytes:

2097152

Oder:

xargs --show-limits

Wir 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 /home

Und 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/. /target

Diejenigen, 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

vmspike schlug eine Àhnliche Befehlsvariante vor:

cp -a -T /source /target

Oz_Alex

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 RUVDS.COM fĂŒr die UnterstĂŒtzung und Möglichkeit zur Veröffentlichung in meinem Blog auf Habr.
  • FĂŒr das Bild TripletConcept. 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.

Das cp-Team: korrektes Kopieren von Ordnern mit Dateien in *nix

Quelle: habr.com

ZuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz kaufen, VPS VDS Server đŸ”„ ZuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz kaufen, VPS VDS Server - ProHoster