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):
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?
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):
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
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.
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
[...]
Tags symbolic-link