Unix: barra dopo i nomi delle directory oppure no


13

Qual è la differenza tra i seguenti comandi?

mv foo bar
mv foo/ bar/
mv foo/ bar
mv foo bar/

O non c'è differenza? O dipende dal comando in uso? Pensa ad esempio a leggere che il comportamento di rsync cambia un po 'a seconda della versione che usi. Qualcuno ha una buona spiegazione, quindi non devo più indovinare e sento di sapere cosa sto facendo?


2
È vero per rsync. Inizia la copia con la directory stessa o con gli elementi sottostanti, a seconda che si salti o si aggiunga la barra finale, rispettivamente.
massimo

@maxelost: potresti aggiungere una risposta con alcuni esempi in modo che sia cristallino che fa cosa?
Svish,

Mikel ha risposto abbastanza chiaramente qui sotto, credo.
massimo

Risposte:


17

Molte utility Unix trattano i collegamenti simbolici in modo diverso a seconda che esista una barra finale.

Questo comportamento è descritto nella documentazione POSIX Symbolic Link ed è anche menzionato nella documentazione GNU coreutils .

Fondamentalmente, la barra finale significa seguire (o "dereference") il collegamento simbolico.

Ad esempio, nel codice seguente, dirlinkindica il collegamento simbolico, ma dirlink/indica la directory a cui punta il collegamento simbolico. rmnon rimuoverà una directory se non lo dici tu rm -r, ma rmsenza opzioni rimuoverà felicemente un link simbolico.

$ mkdir dir
$ ln -s dir dirlink
$ ls -l
total 4
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:26 dir
lrwxrwxrwx 1 mikel mikel    3 2011-02-02 22:26 dirlink -> dir
$ ls -l
total 4
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:26 dir
lrwxrwxrwx 1 mikel mikel    3 2011-02-02 22:26 dirlink -> dir
$ rm dirlink/
rm: cannot remove `dirlink/': Is a directory
$ rm dirlink
$ ls -l
total 4
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:26 dir

È anche utile per visualizzare le autorizzazioni di una directory, senza doversi preoccupare se la directory è una directory reale o solo un link simbolico a una directory.

$ ls -ld dirlink
lrwxrwxrwx 1 mikel mikel 3 2011-02-02 22:46 dirlink -> dir
$ ls -ld dirlink/
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:46 dirlink/

e funziona ancora per le directory regolari:

$ ls -ld dir
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:46 dir
$ ls -ld dir/
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:46 dir/

Un altro esempio è il findcomando. Se gli pathchiedi di cercare è un collegamento simbolico, per impostazione predefinita non seguirà il collegamento simbolico, il che significa che elabora solo il collegamento simbolico. L'aggiunta di una barra finale fa sì che il collegamento simbolico venga considerato come la directory a cui punta il collegamento.

$ find dir
dir
dir/file
$ find dirlink
dirlink
$ find dirlink/
dirlink/
dirlink/file

(alcune versioni di find hanno un'opzione -followo -L, ma ciò fa sì che segua tutti i collegamenti simbolici, non solo il primo)


Nel caso in cui rsync, se si deve aggiungere una barra, dipende se si desidera che la directory che si sta copiando sia una sottodirectory o meno.

$ mkdir dir
$ touch dir/file
$ rsync -r dir dir.bak
$ find .
.
./dir
./dir/file
./dir.bak
./dir.bak/dir
./dir.bak/dir/file
$ rm -r dir.bak
$ rsync -r dir/ dir.bak
$ find .
.
./dir
./dir/file
./dir.bak
./dir.bak/file

In altre parole:

  • rsync dir dir.bakcopie dirin dir.bak, facendo dirdentrodir.bak
  • rsync dir/ dir.bakcopia tutto il contenuto di dir, senza renderlo dirinternodir.bak

2

Come già detto jsalonen, questi comandi hanno effettivamente risultati identici se fooe barsono, di fatto, directory.

Tuttavia, se fooe barnon sono directory, il comando fallirà se si aggiunge una barra finale e avrà esito negativo in caso contrario. Il fatto è che, se il comando ha esito positivo, probabilmente non avrà il risultato desiderato. In effetti, potresti persino perdere dati se fooe barsono file ( barverrebbero sovrascritti).

Se la tua intenzione è quella di specificare directory e non file, allora dovresti usare una barra finale, perché rende il comando più robusto: se l'aspettativa che fooo barsono directory fallisce, allora il comando fallirà con grazia, invece di avere risultati imprevisti.

Inoltre, alcuni comandi (rari) si comportano in modo diverso a seconda della presenza di una barra finale, anche con le directory (un esempio è rsync).


Sì, come ho intuito, i comandi possono o meno gestire bene le barre finali. È molto buono che tu abbia fornito rsync come esempio!
jsalonen,
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.