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á. .