Quando devo usar uma barra no final de um diretório? [duplicado]

51

A maioria dos comandos que eu uso no linux se comportam exatamente da mesma forma, quer eu inclua ou não o caractere / da barra final no final de um nome de diretório.

Por exemplo:

ls /home/cklein
ls /home/cklein/

cp foo bar
cp foo/ bar/

Quando essa barra final é importante? Qual é o significado semântico da barra final?

    
por Cory Klein 10.10.2012 / 19:56

4 respostas

41

Um bom exemplo é mover um arquivo para um diretório:

mv some_file foo

vs.

mv some_file foo/

Se foo não existe, o primeiro irá renomear some_file para foo , em vez da pretendida foo/some_file ; o segundo reclamará, que é o que você quer.

Se foo faz existe, mas não é um diretório, o primeiro pode espancar o arquivo foo ; novamente, o segundo vai reclamar.

cp apresenta problemas semelhantes.

Trabalhando em algumas versões antigas do SunOS, eu desenvolvi o hábito de acrescentar /. , porque o sistema realmente ignorado uma fuga / em um nome de arquivo; por exemplo, /etc/motd/ se referiria ao arquivo em vez de ser um erro. Versões posteriores do SunOS / Solaris não parecem ter esse problema.

    
por 11.10.2012 / 02:25
37

É completamente dependente da ferramenta. rm não permitirá que você remova um link simbólico para um diretório se houver uma barra no final, e o rsync fará coisas diferentes se a especificação do arquivo de origem tiver uma barra no final.

    
por 10.10.2012 / 20:21
15

foo/ é como foo/. , portanto, se foo for um link simbólico para um diretório, foo/ é um diretório (não um symlink) e se foo não for um diretório ou um symlink para um diretório, então você recebe um erro ENOTDIR para qualquer coisa tentando acessar foo/ . Esse é o comportamento no Linux.

O comportamento pode diferir em outros sistemas.

Veja aqui e aqui e aqui para ver o que o POSIX / SUS tem a dizer sobre isso.

    
por 10.10.2012 / 23:50
5

No rsync, a página man é a seguinte:

   A trailing slash on the source changes this behavior to avoid  creating
   an  additional  directory level at the destination.  You can think of a
   trailing / on a source as meaning "copy the contents of this directory"
   as  opposed  to  "copy  the  directory  by name", but in both cases the
   attributes of the containing directory are transferred to the  contain-
   ing  directory on the destination.  In other words, each of the follow-
   ing commands copies the files in the same way, including their  setting
   of the attributes of /dest/foo:

          rsync -av /src/foo /dest
          rsync -av /src/foo/ /dest/foo

A barra final no destino não interessa a todos. Apenas na fonte. (E, claro, só importa se a fonte for um diretório em vez de um único arquivo ou um glob.)

Para ilustrar o diretório para o caso de uso de diretório:

$ mkdir foo bar baz
$ chmod 700 foo
$ chmod 750 bar
$ chmod 705 baz
$ echo hello > foo/file1
$ chmod 606 foo/file1 
$ ls -n
total 0
drwxr-x---  2 501  20   68 Aug  8 15:29 bar/
drwx---r-x  2 501  20   68 Aug  8 15:29 baz/
drwx------  3 501  20  102 Aug  8 15:30 foo/
$ ls -n foo
total 8
-rw----rw-  1 501  20  6 Aug  8 15:30 file1
$ rsync -a foo bar
$ rsync -a foo baz/
$ rsync -a foo bif
$ rsync -a foo bonk/
$ ls -n
total 0
drwxr-x---  3 501  20  102 Aug  8 15:30 bar/
drwx---r-x  3 501  20  102 Aug  8 15:30 baz/
drwxr-xr-x  3 501  20  102 Aug  8 15:30 bif/
drwxr-xr-x  3 501  20  102 Aug  8 15:30 bonk/
drwx------  3 501  20  102 Aug  8 15:30 foo/
$ ls -n *
bar:
total 0
drwx------  3 501  20  102 Aug  8 15:30 foo/

baz:
total 0
drwx------  3 501  20  102 Aug  8 15:30 foo/

bif:
total 0
drwx------  3 501  20  102 Aug  8 15:30 foo/

bonk:
total 0
drwx------  3 501  20  102 Aug  8 15:30 foo/

foo:
total 8
-rw----rw-  1 501  20  6 Aug  8 15:30 file1
$ rm -rf b*
$ mkdir bar baz
$ chmod 750 bar
$ chmod 705 baz
$ rsync -a foo/ bar
$ rsync -a foo/ baz/
$ rsync -a foo/ bif
$ rsync -a foo/ bonk/
$ ls -n
total 0
drwx------  3 501  20  102 Aug  8 15:30 bar/
drwx------  3 501  20  102 Aug  8 15:30 baz/
drwx------  3 501  20  102 Aug  8 15:30 bif/
drwx------  3 501  20  102 Aug  8 15:30 bonk/
drwx------  3 501  20  102 Aug  8 15:30 foo/
$ ls -n *
bar:
total 8
-rw----rw-  1 501  20  6 Aug  8 15:30 file1

baz:
total 8
-rw----rw-  1 501  20  6 Aug  8 15:30 file1

bif:
total 8
-rw----rw-  1 501  20  6 Aug  8 15:30 file1

bonk:
total 8
-rw----rw-  1 501  20  6 Aug  8 15:30 file1

foo:
total 8
-rw----rw-  1 501  20  6 Aug  8 15:30 file1
$ 
    
por 09.08.2017 / 00:41