differenza copia cartella dei contenuti tra /. e / * in linux


8

per copiare il contenuto da una cartella che ho letto, l'uso è:

cp -rfva ../foldersource/. ./

ma funziona anche questo

cp -rfva ../foldersource/* ./

c'è qualche differenza?

per esempio se voglio cancellare un contenuto da una cartella con. :

rm -rf ../foldersource/.

ottengo l'errore:

rm:  rejet delete folder '.' or '..':

ma con l'asterisco va bene

rm -rf ../foldersource/*

quindi, l'asterisco è opzioni migliori che funzionano ovunque?

Risposte:


10

C'è una differenza fondamentale tra queste due forme argomentative. Ed è importante capire cosa sta succedendo.

Con ../foldersource/.l'argomento viene passato invariato al comando, sia esso cpo rmo qualcos'altro. Spetta al comando se quel punto finale ha una semantica speciale o unica diversa dalla convenzione Unix standard di indicare semplicemente la directory in cui risiede; entrambi rme cpsembrano trattarlo come un caso speciale.

Con ../foldersource/*l'argomento viene prima espanso dalla shell prima che il comando venga mai eseguito e passato qualsiasi argomento. Quindi, rmnon vede mai ../foldersource/*; vede la versione espansa ../foldersource/file1.ext ../foldersource/file2.ext ../foldersource/childfolder1e 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.


4
It's up to the command whether that trailing dot makes any senseEhm, il punto si collega sempre alla stessa directory contenente, quindi ../foldersource/.non dovrebbe essere diverso dall'affermare ./foldersource/e in effetti è solo un modo ridondante per affermare la stessa cosa. Nessun comando tenta di "dare un senso" al punto o al doppio punto, poiché questi sono standard sui filesystem Linux / Unix. rmrifiuta semplicemente la rimozione della directory di lavoro corrente come jimmijindicato nella loro risposta. Inoltre, tieni presente che stai utilizzando ./tutti i tuoi esempi mentre OP è ../presente. Un po 'una (grande) differenza.
Sergiy Kolodyazhnyy,

"cp -rfva ../foldersource/. ./" equivale a "cp -rfva ../foldersource ./", voglio copiare il contenuto delle cartelle, ma non la cartella principale
stackdave

1
@Stackdave no, cp -rfva ../foldersource/. ./ NON è equivalente a cp -rfva ../foldersource ./ . Il trailing /.è significativo
roaima,

2
Mentre ciò che dice questa risposta è corretto, manca una differenza molto importante come menzionato nella risposta di @ roaima: la variante / * non (di solito) copia file o directory che iniziano con.
Adam,

@SergiyKolodyazhnyy Hai ragione; la .è una convenzione standard in Unix per indicare direttamente la corrente. Inoltre, grazie per aver sottolineato che avevo usato ./nei miei esempi quando avrei dovuto usare ../; Lo aggiusterò. Non sei corretto sul fatto che i comandi "abbiano senso" del punto finale; come indica l'OP (e ho già sperimentato cp) entrambi rme si cpcomportano diversamente quando .è presente un trailing . Avrei dovuto scrivere qualcosa del tipo "dipende dal comando se il punto finale ha una semantica speciale o unica". Cambierò la mia risposta per chiarezza.
eestrada,

10

Quando copi usando cp -a source/* target/stai copiando la maggior parte dei file e delle directory da sourcea target. In particolare, 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, compresi tutti gli elementi che iniziano con un punto ( .) intarget

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, zshpuoi usare l' dotglobopzione per cambiare il significato in *modo che includa file e directory che iniziano con un punto ( yashha anche dotglobun'opzione; tuttavia, include quindi .e ..in espansioni glob che ne limitano l'usabilità. Vedi anche FIGNORE='@(.|..)'in ksh93).

È interessante notare che cp -a source/. target/è garantito che non crei mai il componente target/source. (D'altra parte, cp -a source target/farà una delle due cose a seconda che esista o meno targetgià. Vedi Come copiare ricorsivamente una cartella in modo idempotente usando cp per i dettagli.)


Quando elimini usando rm -rf source/*stai cancellando i file e le directory all'interno sourceche non iniziano con un punto ( .). Fatta salva l' dotglobimpostazione che ho già menzionato. Non eliminerà la directory sourcestessa.

Quando si tenta di eliminare utilizzando rm -rf source/., l'operazione fallirà, come altri hanno già spiegato , perché POSIX proibisce l'eliminazione di un percorso il cui ultimo componente è .o ... L'equivalente più vicino è rm -rf source, che eliminerà la sourcedirectory e tutto il suo contenuto indipendentemente dal fatto che inizino o meno con un punto ( .).



7

Non puoi farlo rm -rf ../foldersource/.perché rmnon lo consente, come esplicitamente indicato 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 rmvediamo:

Se uno dei file punto o punto-punto sono specificati come parte del nome di base di un operando (ovvero il componente nome percorso finale) o se un operando si risolve nella directory principale, rm deve scrivere un messaggio diagnostico in errore standard e non fare nulla più con tali operandi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.