příkaz cp: zkopírujte správně složky souborů do *nix

příkaz cp: zkopírujte správně složky souborů do *nix

Tento článek odhalí některé nesrozumitelné věci související s používáním zástupné znaky při kopírování nejednoznačné chování příkazů cp při kopírování a také metody, které vám umožní správně zkopírovat velké množství souborů bez přeskakování nebo padání.

Řekněme, že potřebujeme zkopírovat vše ze složky /source do složky /target.

První věc, která vás napadne, je:

cp /source/* /target

Okamžitě opravíme tento příkaz na:

cp -a /source/* /target

Klíč -a přidá kopírování všech atributů, práv a přidá rekurzi. Pokud není vyžadována přesná reprodukce práv, postačí klíč -r.

Po zkopírování zjistíme, že nebyly zkopírovány všechny soubory - soubory začínající tečkou jako:

.profile
.local
.mc

a podobně.

proč se to stalo?

Protože zástupné znaky zpracovává shell (bash v typickém případě). Ve výchozím nastavení bude bash ignorovat všechny soubory začínající tečkami, protože je považuje za skryté. Abychom se tomuto chování vyhnuli, budeme muset chování změnit bash pomocí příkazu:

shopt -s dotglob

Abyste zajistili, že tato změna chování přetrvá i po restartu, můžete pomocí tohoto příkazu vytvořit soubor wildcard.sh ve složce /etc/profile.d (Možná má vaše distribuce jinou složku).

A pokud ve zdrojovém adresáři nejsou žádné soubory, pak shell nebude moci nahradit nic místo hvězdičky a kopírování se také nezdaří s chybou. Proti této situaci existují možnosti failglob и nullglob. Budeme muset nastavit failglob, což zabrání provedení příkazu. nullglob nebude fungovat, protože převede řetězec se zástupnými znaky, který nenašel shodu, na prázdný řetězec (nulové délky), který pro cp způsobí chybu.

Pokud jsou však ve složce tisíce souborů nebo více, pak by měl být přístup se zástupnými znaky zcela opuštěn. Faktem je, že bash rozšiřuje zástupné znaky do velmi dlouhého příkazového řádku jako:

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

Existuje omezení délky příkazového řádku, které zjistíme pomocí příkazu:

getconf ARG_MAX

Pojďme získat maximální délku příkazového řádku v bajtech:

2097152

Или:

xargs --show-limits

Dostáváme něco jako:

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

Takže se obejdeme úplně bez zástupných znaků.

Pojďme si napsat

cp -a /source /target

A zde se potýkáme s nejednoznačností chování cp. Pokud složka /target neexistuje, získáme to, co potřebujeme.

Pokud však cílová složka existuje, budou soubory zkopírovány do složky /target/source.

Nemůžeme vždy předem smazat složku /target, protože může obsahovat soubory, které potřebujeme, a naším cílem je například doplnit soubory v /target soubory z /source.

Pokud by se zdrojová a cílová složka jmenovala stejně, například jsme kopírovali z /source do /home/source, pak bychom mohli použít příkaz:

cp -a /source /home

A po zkopírování by se soubory v /home/source doplnily o soubory z /source.

To je logický problém: můžeme přidat soubory do cílového adresáře, pokud jsou složky pojmenovány stejně, ale pokud se liší, zdrojová složka bude umístěna do cílového adresáře. Jak zkopírovat soubory z /source do /target pomocí cp bez zástupných znaků?

Abychom toto škodlivé omezení obešli, používáme řešení, které není zřejmé:

cp -a /source/. /target

Ti, kteří znají DOS a Linux, již pochopili vše: uvnitř každé složky jsou 2 neviditelné složky „.“ a „..“, což jsou odkazy na pseudosložky na aktuální a vyšší adresáře.

  • Při kopírování cp zkontroluje existenci a pokusí se vytvořit /cíl/.
  • Takový adresář existuje a je to /target
  • Soubory z /source se zkopírují do /target správně.

Pověste si ho tedy do výrazného rámečku na památku nebo na zeď:

cp -a /source/. /target

Chování tohoto příkazu je jasné. Vše bude fungovat bez chyb, bez ohledu na to, zda máte milion souborů nebo vůbec žádné.

Závěry

Pokud potřebujete kopírovat vše soubory z jedné složky do druhé, nepoužíváme zástupné znaky, je lepší je použít cp v kombinaci s tečkou na konci zdrojové složky. To zkopíruje všechny soubory, včetně skrytých, a nebude selhat s miliony souborů nebo vůbec žádnými soubory.

Doslov

vmspike navrhl verzi příkazu s podobným výsledkem:

cp -a -T /source /target

Oz_Alex

cp -aT /source /target

POZNÁMKA: dopisní pouzdro T má význam. Pokud to zamícháte, dostanete úplné svinstvo: změní se směr kopírování.
Poděkování:

  • Společnosti RUVDS.COM za podporu a možnost publikovat na svém blogu na Habré.
  • Za obrázek Trojitý koncept. Obrázek je velmi velký a detailní, lze jej otevřít v samostatném okně.

PS Případné chyby, kterých si všimnete, pošlete do soukromé zprávy. Zvyšuji si za to karmu.

příkaz cp: zkopírujte správně složky souborů do *nix

Zdroj: www.habr.com

Přidat komentář