Selecionando arquivos que começam com $ LETTER, ou uma letra depois de $ LETTER no alfabeto

2

Suponha que um diretório contenha os seguintes arquivos:

  • afile1
  • afile2
  • bfile
  • cfile
  • ffile
  • ffile2
  • qfile
  • zfile

Estou procurando uma maneira fácil de selecionar todos os arquivos que começam com $ LETTER, ou comece com uma letra depois de $ LETTER no alfabeto. Uma solução que poderia ser facilmente modificada para encontrar arquivos que começam com $ LETTER ou arquivos que começam com uma letra anterior de $ LETTER no alfabeto seria útil.

Por exemplo Na lista acima, com LETTER = c, eu quero selecionar "cfile, ffile, ffile2, qfile, zfile"

O acima é um exemplo simplificado. No mundo real, o diretório conterá vários milhares de arquivos. No final, usei ls | tail -n${FUDGE_FACTOR} , onde o fator fudge foi descoberto manualmente, mas estou procurando uma maneira de fazer isso automaticamente.

Estou procurando uma solução baseada em shell para isso (eu uso BASH, mas soluções em outros shells são bem-vindas). Estou ciente de que scripts de shell provavelmente não são a melhor ferramenta para esta tarefa, mas estou pedindo apenas interesse (para saber mais sobre shell scripts), então por favor não responda com as respostas em python / perl / lua / $ FAVE_SCRIPTING_LANGUAGE

Comentários gerais sobre as limitações dos scripts de shell para este tipo de tarefa, e a melhor maneira de contornar essas limitações na realidade (ou seja, sem a minha estipulação "deve ser uma solução baseada em shell"), seria bem-vinda.

Obrigado

    
por pisswillis 18.01.2011 / 20:25

3 respostas

6

Na verdade, é muito simples:

echo [$LETTER-z]*

Se você quiser distinção entre maiúsculas e minúsculas:

echo [$(echo "$LETTER" | tr a-z A-Z)-Z$LETTER-z]*

Isso funciona porque o shell executa expansão de parâmetro antes de expansão do nome do caminho (ou seja, globbing).

    
por 18.01.2011 / 22:01
1

Que tal usar o globbing integrado do shell?

LETTER=c; echo [$LETTER-z]*

Isso funcionou em bash e ksh para mim.

    
por 18.01.2011 / 21:49
0

Você pode usar um script como este:

START=c
END=q
ls | egrep ^[$START-$END].*

isso selecionaria todos os arquivos que começam com c até q.

exemplo de saída:

[gbeech@svr01 test]$ echo  ^[$START-$END].*
^[c-q].*
[gbeech@svr01 test]$ ls | egrep ^[$START-$END].*
cfile
ffile
ffile2
qfile

ele também pode ser expandido para limitar o grep, em praticamente qualquer maneira que você possa ajustar um regex para fazer.

    
por 18.01.2011 / 21:13