No Unix é possível listar entradas de diretório após um ponto de partida?

1

Por exemplo, se meu diretório contiver arquivos a, b, c, c1, c2, c3, c4, d, e, f, g

Existe um comando como o seguinte pseudo-código

ls -filename > "c2"

que listaria apenas os arquivos c3, c4, d, e, f

EDITAR: Pergunta modificada para abordar um caso mais geral

    
por Noah 02.06.2009 / 20:35

7 respostas

3

Ah - você quer procurar em um ordenamento léxico. Use isto:

ls | awk '$1 >= "c3" && $1 <= "f" {print;}'
    
por 02.06.2009 / 23:00
3

No bash, você pode fazer algo como:

$ ls [d-f] *

Ou você pode escrever um script de shell.

    
por 02.06.2009 / 20:40
2

Usando expressões regulares:

ls | egrep "[d-z].*"

Este é geralmente o caso de solicitações estranhas como a sua. Você está pedindo para fazer algo que é muito incomum e envolve a compreensão da estrutura lexical dos nomes de diretório.

Aprenda expressões regulares em: regular-expressions.info

e digite:

man grep

Para ler a página de manual de grep .

    
por 02.06.2009 / 20:38
1

Usando o comando grep, você pode fazer qualquer tipo de filtragem necessária. Semelhante ao comando FIND no Windows. Abaixo está uma opção. Se você deseja obter uma listagem completa, como o que obtém com "ls -l", talvez seja necessário combinar isso com o AWK.

> ls -1 | grep ^[def]
    
por 02.06.2009 / 20:40
1

Ao longo das linhas da resposta anterior:

use a expansão de nome de arquivo do shell em vez de usar o egrep:

ls [d-z]*
    
por 02.06.2009 / 20:40
0

ls | grep -A 1000000 '^ c2 $' | cauda -n +2

O grep fornece a linha correspondente e o próximo milhão; a cauda corta a primeira linha.

Se você quiser uma versão longa, adicionar "| xargs ls -l" ao final funcionaria.

Limitações: isso não funcionará bem com nomes de arquivos interessantes (especialmente nomes de arquivos com novas linhas, mas pode ter problemas com espaços, caracteres de controle etc.). E não funcionará se você tiver mais de um milhão de arquivos no diretório.

    
por 02.06.2009 / 22:00
0

Não é a resposta definitiva, mas isso deve funcionar.

ls -1 | while read f ; do [[ "$f" > "g2" ]] && echo $f ; done

Poderia ser mais evoluído usando "$ (echo $ f | tr [A-Z] [a-z])" para ignorar o caso. Isso funciona apenas para strings ASCII, ele não poderá ordenar nomes de arquivos Unicode (ou iso- *)

    
por 02.06.2009 / 22:49

Tags