GNU/Linux >> Znalost Linux >  >> Linux

rozdíl kopírovat obsah složky mezi /. a /* v linuxu

Mezi těmito dvěma formami argumentů je zásadní rozdíl. A je důležité pochopit, co se děje.

S ../foldersource/. argument je předán beze změny příkazu, ať už je to cp nebo rm nebo něco jiného. Je na příkazu, zda má tato koncová tečka speciální nebo jedinečnou sémantiku odlišnou od standardní unixové konvence spočívající v pouhém ukazování na adresář, ve kterém se nachází; oba rm a cp Zdá se, že to považuje za zvláštní případ.

S ../foldersource/* argument je nejprve rozšířen pomocí shellu před příkaz je vždy dokonce proveden a předá jakékoli argumenty. Tedy rm nikdy nevidí ../foldersource/*; vidí rozšířenou verzi ../foldersource/file1.ext ../foldersource/file2.ext ../foldersource/childfolder1 a tak dále. To je důležité, protože operační systémy omezují počet argumentů, které lze příkazu předat, obvykle jen několik stovek.


Při kopírování pomocí cp -a source/* target/ kopírujete většinu souborů a adresářů z source na target . Konkrétně položky, které jsou vyloučeny, budou pravděpodobně soubory začínající tečkou (. ) v nejvyšší úrovni source .

Zvažte tyto soubory (nebo adresáře) v source

apple        # will be copied
banana/      # will be copied, as will all its contents
.cherry      # will not be copied

Při kopírování pomocí cp -a source/. target/ kopírujete celý obsah source , včetně všech položek začínajících tečkou (. ) na target

Zvažte tyto soubory (nebo adresáře) v source

apple        # will be copied
banana/      # will be copied, as will all its contents
.cherry      # will be copied

Pokud používáte bash , zsh , můžete použít dotglob možnost změnit význam * takže obsahuje soubory a adresáře začínající tečkou (yash má také dotglob volba; nicméně pak obsahuje . a .. v globálních expanzích, což omezuje jeho použitelnost. Viz také FIGNORE='@(.|..)' v ksh93 ).

Zajímavé je, že cp -a source/. target/ je zaručeno nikdy pro vytvoření komponenty target/source . (Na druhou stranu cp -a source target/ provede jednu ze dvou věcí v závislosti na tom, zda target již existuje. Podrobnosti viz Jak rekurzivně kopírovat složku idempotentním způsobem pomocí cp.)

Když smažete pomocí rm -rf source/* odstraňujete soubory a adresáře v source které nezačínají tečkou (. ). Podléhá dotglob nastavení, o kterém jsem se již zmínil. Nedojde k odstranění adresáře source sám.

Při pokusu o smazání pomocí rm -rf source/. selže – jak již vysvětlili jiní – protože POSIX zakazuje smazání cesty, jejíž poslední komponentou je . nebo .. . Nejbližší ekvivalent je rm -rf source , čímž smažete source adresář a veškerý jeho obsah bez ohledu na to, zda začínají tečkou či nikoli (. ).


Nemůžete udělat rm -rf ../foldersource/. protože rm to neumožňuje, jak je výslovně uvedeno v příručce:

Jakýkoli pokus o odstranění souboru, jehož komponenta posledního názvu souboru je '.' nebo '..', je odmítnut bez jakékoli výzvy, jak nařizuje POSIX.

a v manuálu POSIX man 1p rm vidíme:

Pokud je některý ze souborů tečka nebo tečka-tečka specifikován jako základní část anoperandu (tj. konečná komponenta názvu cesty) nebo pokud se operand překládá do kořenového adresáře, rm zapíše diagnostickou zprávu se standardní chybou a s takovými operandy již nic nedělá. .


Linux
  1. Jaký je rozdíl mezi linuxovým kontejnerem a obrázkem?

  2. Rozdíl mezi příkazy „su“ a „su -“ v Linuxu

  3. Windows – sdílená složka mezi hostem Qemu Windows a hostitelem Linuxu?

  1. Linux – rozdíl mezi uživatelským prostorem a prostorem jádra?

  2. Linux – rozdíl mezi Pts a Tty?

  3. Rozdíl mezi absolutní a relativní cestou v Linuxu

  1. Naučte se rozdíl mezi příkazy „su“ a „su -“ v Linuxu

  2. Jaký je rozdíl mezi Suspend a Hibernate v Linuxu

  3. linux rozdíl mezi sudo crontab -e a jen crontab -e