Como posso encontrar a diferença entre uma pasta e um link de pasta no Ubuntu?

4

Anteriormente, eu havia criado alguns links para outra pasta usando o seguinte comando.

sudo ln -s path_name link_name 

Esses links estão parecidos com as pastas. Não consigo diferenciar entre uma pasta e um link. Existe uma maneira de encontrar a diferença entre uma pasta e um link para outra pasta?

    
por mateen 13.02.2015 / 06:44

4 respostas

5

Você pode reconhecer um link por uma pequena seta ( -> ) na saída de ls -l :

ou pela cor distinta, que também aparece na saída de ls , conforme descrito em esta resposta ( test2 é o link):

    
por Jacob Vlijm 13.02.2015 / 07:27
6

Existem muitas maneiras de ver isso. Primeiro de tudo, é indicado na saída de ls -l . Observe que o diretório tem um d no início do campo de permissões, enquanto o link tem um l :

$ ls -l
drwxr-xr-x 2 terdon terdon 4096 Feb 13 14:12 bar
lrwxrwxrwx 1 terdon terdon    3 Feb 13 14:12 foo -> bar

Você também pode usar file :

$ file bar foo 
bar: directory 
foo: symbolic link to 'bar' 

Outra opção é readlink , que segue os links simbólicos para seus destinos:

$ readlink foo
bar

A execução de readlink bar não retornará nenhuma saída (falha, retornando um código de saída diferente de 0), para que você possa fazer algo como:

readlink bar || echo "Not a link!"

ou

readlink foo && "Echo this is a link"

Por fim, você também pode usar find ou o próprio shell para listar todos os links:

find . -type l

ou

for f in *; do [ -L "$f" ] && echo "$f is a link"; done
    
por terdon 13.02.2015 / 13:20
2

Leia man [ (ou man test ) e você verá que pode fazer:

for theDir in path_name link_name ; do  
    if [ -L $theDir ] ; then  
        echo "$theDir exists and is a symbolic link"   
    elif [ -d $theDir ] ; then  
        echo "$theDir exists and is a directory"  
    fi  
done

Alterei a ordem dos testes, portanto, a verificação de um diretório é feita somente se $theDir não for um link.

    
por waltinator 13.02.2015 / 06:54
1

use ls -F .

isto fará ls acrescentar caracteres a nomes de arquivos

* para arquivos executáveis

/ para diretórios

@ para links simbólicos **

| para FIFOs

> para portas (o que isso significa)

= para soquetes

arquivos regulares não têm classificador no final. Então, no seu caso, você verá @ no final de cada nome de link simbólico e / no final do diretório real.

No entanto, se você usar ls -l , não verá classificadores para links simbólicos e, em vez disso, verá -> e vincular o destino depois disso.

Você também pode usar stat e file para diferenciar dirs / symlinks por exemplo:

$ file a                                                                                                                                                                                     
a: directory

$ file b                                                                                                                                                                                      
b: symbolic link to a

$ stat a                                                                                                                                                                                  
  File: 'a'
  Size: 40          Blocks: 0          IO Block: 4096   directory
 [...]

$ stat b                                                                                                                                                                                    
  File: 'b' -> 'a'
  Size: 1           Blocks: 0          IO Block: 4096   symbolic link
  [...]
    
por suawek 13.02.2015 / 17:29