Lista de arquivos de determinado tipo sob um diretório?

2

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.

    
por Tim 28.07.2014 / 18:18

5 respostas

4

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
    
por 28.07.2014 / 18:26
3

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.

    
por 28.07.2014 / 18:36
2

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 *(@)
    
por 29.07.2014 / 03:23
0

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:

link

    
por 08.03.2016 / 18:26
-2

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

    
por 08.03.2016 / 17:03

Tags