C'è una differenza fondamentale tra queste due forme di argomentazione. Ed è importante capire cosa sta succedendo.
Con ../foldersource/.
l'argomento viene passato invariato al comando, indipendentemente dal fatto che sia cp
o rm
o qualcos'altro. Dipende dal comando se quel punto finale ha una semantica speciale o univoca diversa dalla convenzione Unix standard di puntare semplicemente alla directory in cui risiede; entrambi rm
e cp
sembrano trattarlo come un caso speciale.
Con ../foldersource/*
l'argomento viene prima espanso dalla shell before il comando viene mai eseguito e viene passato qualsiasi argomento. Quindi, rm
non vede mai ../foldersource/*
; vede la versione espansa ../foldersource/file1.ext ../foldersource/file2.ext ../foldersource/childfolder1
e così via. Questo è importante perché i sistemi operativi limitano il numero di argomenti che possono essere passati a un comando, di solito solo poche centinaia.
Quando copi usando cp -a source/* target/
stai copiando la maggior parte dei file e delle directory da source
a target
. Nello specifico, gli elementi esclusi saranno probabilmente file che iniziano con un punto (.
) nel livello superiore di source
.
Considera questi file (o directory) in source
apple # will be copied
banana/ # will be copied, as will all its contents
.cherry # will not be copied
Quando copi usando cp -a source/. target/
stai copiando l'intero contenuto di source
, inclusi tutti gli elementi che iniziano con un punto (.
) a target
Considera questi file (o directory) in source
apple # will be copied
banana/ # will be copied, as will all its contents
.cherry # will be copied
Se stai usando bash
, zsh
, puoi utilizzare dotglob
opzione per cambiare il significato di *
in modo che includa file e directory che iniziano con un punto (yash
ha anche un dotglob
opzione; tuttavia, include poi .
e ..
nelle espansioni glob che ne limitano l'usabilità. Vedi anche FIGNORE='@(.|..)'
in ksh93
).
È interessante notare che cp -a source/. target/
è garantito mai per creare il componente target/source
. (D'altra parte, cp -a source target/
farà una delle due cose a seconda se target
o meno esiste già. Vedi Come copiare una cartella in modo ricorsivo in modo idempotente usando cp per i dettagli.)
Quando elimini usando rm -rf source/*
stai eliminando i file e le directory all'interno di source
che non iniziano con un punto (.
). Soggetto al dotglob
impostazione che ho già menzionato. Non eliminerà la directory source
stesso.
Quando si tenta di eliminare utilizzando rm -rf source/.
fallirà - come altri hanno già spiegato - perché POSIX proibisce la cancellazione di un percorso il cui ultimo componente è .
o ..
. L'equivalente più vicino è rm -rf source
, che eliminerà il source
directory e tutto il suo contenuto indipendentemente dal fatto che inizino o meno con un punto (.
).
Non puoi fare rm -rf ../foldersource/.
perché rm
non lo consente, come esplicitamente dichiarato nel manuale:
Qualsiasi tentativo di rimuovere un file il cui ultimo componente del nome file è '.' o '..' viene rifiutato senza alcuna richiesta, come richiesto da POSIX.
e nel manuale POSIX man 1p rm
vediamo:
Se uno dei file punto o punto-punto è specificato come porzione del nome di base di un operando (ovvero, il componente del percorso finale) o se un operando si risolve nella directory root, rm scriverà un messaggio diagnostico nell'errore standard e non farà più nulla con tali operandi .