cp Kommando: Korrekt kopéiert Dateidateien an *nix

cp Kommando: Korrekt kopéiert Dateidateien an *nix

Dësen Artikel wäert e puer net offensichtlech Saachen opzeweisen am Zesummenhang mat der Benotzung vun wildcards wann Kopie, zweedeiteg Kommando Verhalen cp wann Dir kopéiert, souwéi Methoden déi Iech erlaben eng riesech Unzuel u Dateien korrekt ze kopéieren ouni ze sprangen oder ze crashen.

Loosst eis soen, mir mussen alles aus dem / Source Dossier an den / Target Dossier kopéieren.

Dat éischt wat an de Kapp kënnt ass:

cp /source/* /target

Loosst eis dëst Kommando direkt korrigéieren op:

cp -a /source/* /target

Schlëssel -a wäert d'Kopie vun all Attributer, Rechter a Rekursioun addéieren. Wann déi exakt Reproduktioun vu Rechter net erfuerderlech ass, ass e Schlëssel genuch -r.

No der Kopie fanne mir datt net all Dateie kopéiert goufen - Dateien ufänken mat engem Punkt wéi:

.profile
.local
.mc

an esou.

Firwat ass dat geschitt?

Well Wildcards vun der Shell veraarbecht ginn (bash an engem typesche Fall). Par défaut ignoréiert bash all Dateien, déi mat Punkten ufänken, well se se als verstoppt behandelen. Fir dëst Verhalen ze vermeiden, musse mir Verhalen änneren bash benotzt de Kommando:

shopt -s dotglob

Fir sécherzestellen datt dës Verhalensännerung no engem Neistart bestoe bleift, kënnt Dir eng Wildcard.sh Datei mat dësem Kommando am Dossier erstellen /etc/profile.d (Vläicht huet Är Verdeelung en aneren Dossier).

A wann et keng Dateien am Quellverzeechnes sinn, da kann d'Schuel näischt an der Plaz vun der Stern ersetzen, an d'Kopie fällt och mat engem Feeler. Et gi Méiglechkeeten géint dës Situatioun failglob и nullglob. Mir mussen setzen failglob, wat verhënnert datt de Kommando ausgefouert gëtt. nullglob wäert net schaffen, well et eng String mat Wildcards konvertéiert, déi kee Match fonnt hunn, an eng eidel String (null Längt), déi fir cp wäert e Feeler verursaachen.

Wéi och ëmmer, wann et Dausende vu Dateien oder méi am Dossier sinn, da sollt d'Wildcards Approche ganz opginn. D'Tatsaach ass dat bash erweidert Wildcards an eng ganz laang Kommandozeil wéi:

cp -a /souce/a /source/b /source/c …… /target

Et gëtt eng Limit fir d'Längt vun der Kommandozeil, déi mir erausfannen mat dem Kommando:

getconf ARG_MAX

Loosst eis déi maximal Längt vun der Kommandozeil an Bytes kréien:

2097152

Oder:

xargs --show-limits

Mir kréien eppes wéi:

….
Maximum length of command we could actually use: 2089314
….

Also, loosst eis ganz ouni Wildcards maachen.

Loosst eis just schreiwen

cp -a /source /target

An hei si mir mat Ambiguitéit vum Verhalen konfrontéiert cp. Wann den / Target Dossier net existéiert, da kréie mir dat wat mir brauchen.

Wéi och ëmmer, wann den Zil-Ordner existéiert, da ginn d'Dateien an den /target/source-Ordner kopéiert.

Mir kënnen den / Target Dossier net ëmmer am Viraus läschen, well et Dateien enthält déi mir brauchen an eist Zil ass zum Beispill d'Dateien an / Target mat Dateien aus /source ze ergänzen.

Wann d'Quell- an Destinatiounsdateien d'selwecht genannt goufen, zum Beispill, mir kopéieren vun / Quell op / Heem / Quell, da kënne mir de Kommando benotzen:

cp -a /source /home

An no der Kopie ginn d'Dateien an /home/source ergänzt mat Dateien aus /source.

Dëst ass e logesche Problem: mir kënnen Dateien an den Destinatiounsverzeechnes addéieren wann d'Ordner déiselwecht benannt sinn, awer wa se anescht sinn, da gëtt de Quelldopper an der Destinatioun plazéiert. Wéi kopéieren ech Dateien vun / Quell op / Target mat cp ouni Wildcards?

Fir dës schiedlech Begrenzung ëmzegoen, benotze mir eng net offensichtlech Léisung:

cp -a /source/. /target

Déi, déi mat DOS a Linux vertraut sinn, hu schonn alles verstanen: an all Dossier ginn et 2 onsichtbar Ordner "." an "..", déi Pseudo-Ordner Linken op déi aktuell a méi héich Verzeechnes sinn.

  • Beim Kopie cp kontrolléiert d'Existenz a probéiert /Target/ ze kreéieren.
  • Esou e Verzeechnes existéiert an et ass / Target
  • Dateien aus /source ginn op /target korrekt kopéiert.

Also, hänkt et an engem fett Kader an Ärer Erënnerung oder op der Mauer:

cp -a /source/. /target

D'Behuele vun dësem Kommando ass kloer. Alles funktionnéiert ouni Feeler, egal ob Dir eng Millioun Dateien hutt oder guer keng.

Conclusiounen

Wann Dir musst kopéieren all dat Dateien vun engem Dossier an en aneren, mir benotze keng Wildcards, et ass besser se ze benotzen amplaz cp kombinéiert mat enger Period um Enn vun der Quell Dossier. Dëst kopéiert all Dateien, inklusiv verstoppt, a wäert net mat Millioune Dateien oder guer keng Dateien versoen.

Afterword

vm spike proposéiert eng Kommando Versioun mat engem ähnleche Resultat:

cp -a -T /source /target

Oz_Alex

cp -aT /source /target

NOTÉIERT: Bréiwer Fall T huet d'Bedeitung. Wann Dir et vermëscht, kritt Dir komplett Dreck: d'Kopieerrichtung ännert sech.
Unerkennungen:

  • Firmen RUVDS.COM fir Ënnerstëtzung an d'Méiglechkeet op Ärem Blog op Habré ze publizéieren.
  • Per Bild Triple Konzept. D'Bild ass ganz grouss an detailléiert, kann an enger separater Fënster opgemaach ginn.

PS Schéckt w.e.g. all Feeler déi Dir bemierkt an engem privaten Message. Ech erhéijen mäi Karma fir dëst.

cp Kommando: Korrekt kopéiert Dateidateien an *nix

Source: will.com

Setzt e Commentaire