GNU/Linux >> Linux Esercitazione >  >> Linux

differenza copia la cartella dei contenuti tra /. e /* in Linux

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 .


Linux
  1. Scopri la differenza tra i comandi "su" e "su -" in Linux

  2. Qual è la differenza tra sospensione e ibernazione in Linux

  3. Qual è la differenza tra un container Linux e un'immagine?

  4. Windows:cartella condivisa tra Qemu Windows Guest e Linux Host?

  5. Differenza tra cp -r e cp -R (comando copia)

Copia i file tra Linux e FreeDOS

Comprendere la differenza tra il comando sudo e su su Linux

Qual ​​è la differenza tra i kernel macOS e Linux

Qual è la differenza tra Linux e Unix?

differenza tra netstat e ss in linux?

Differenza tra i comandi 'ifconfig' e 'ip'