Você pode usar os operadores de teste de arquivo documentados em man test
. Por exemplo, para listar links simbólicos:
for i in *;do if [ -L "$i" ] ;then printf -- "%s\n" "$i";fi;done
Se você quiser listar apenas diretórios (no diretório atual) use ls -d */
E se você quiser listar apenas arquivos comuns, apenas arquivos executáveis, ou apenas links, ou arquivos de qualquer outro tipo?
Porque ls -F
acrescenta *
aos arquivos executáveis, @
aos arquivos simbólicos vinculados, /
aos diretórios, tentei
ls -d **
e
ls -d *@
, mas eles não funcionam.
Você pode usar os operadores de teste de arquivo documentados em man test
. Por exemplo, para listar links simbólicos:
for i in *;do if [ -L "$i" ] ;then printf -- "%s\n" "$i";fi;done
Você pode usar find
.
Listar todos os arquivos:
find . ! -name . -prune -type f
Lista de todos os links simbólicos:
find . ! -name . -prune -type l
Listar todos os executáveis:
find . ! -name . -prune -type f -perm +111
Você pode ler a documentação POSIX do POSIX para obter mais opções avançadas.
Um comando como ls -d *@
lista os arquivos cujo nome termina com @
. O caractere @
faz parte do padrão que o nome do arquivo deve corresponder. Quando ls -F
exibe um caractere após um nome de arquivo, esse caractere não faz parte do nome do arquivo, é uma indicação extra adicionada por ls
(esse é o ponto da opção -F
).
ls
não tem uma opção para selecionar os tipos de arquivos a serem listados. Se os nomes dos seus arquivos não contiverem caracteres especiais, como novas linhas ou os sufixos que ls -F
adiciona, você poderá usar ls -F
para listar determinados tipos de arquivos e filtrar sua saída. Por exemplo, para listar links simbólicos no diretório atual, você pode usar
ls -F | grep '@$'
Uma maneira mais robusta de listar arquivos de um tipo selecionado é com o comando find
. Ao contrário de ls
, find
é recursivo; use a ação -prune
para interromper a recursão. Outra diferença é que find
não trata os arquivos cujo nome começa com .
(arquivos de pontos) especialmente, enquanto ls
os ignora, e padrões de shell como *
também os ignoram. Por exemplo, o comando a seguir lista os links simbólicos no diretório atual:
find . -name . -o -type l -print -o -prune
Outra maneira de realizar a filtragem é fazer uma iteração de todos os arquivos em um loop e fazer um teste para selecionar o que você deseja.
for x in *; do
if [ -L "$x" ]; then echo "$x"; fi
done
No zsh, você pode usar os qualificadores para restringir os arquivos por tipo. Por exemplo, o seguinte comando zsh lista os links simbólicos no diretório atual:
print -rl *(@)
Eu sugiro considerar perl
, porque ele tem um operador interno útil - grep
. Que ao contrário da versão do comando, na verdade, permite um teste de 'bloco de código'.
Então você pode:
perl -e 'print join "\n", grep { -d } glob "$dir/*"'
O qual imprimirá arquivos correspondentes ao teste -d
e a vários outros:
Digamos que você queira ver apenas os arquivos de origem c (sufixo .c) em uma lista:
ls -l *.c
Isso listará todos os arquivos de código c.
Aproveite
Tags ls