Usando Glob com diretórios em Ruby

"Globbing"arquivos (com Dir.glob) no Ruby permite selecionar apenas os arquivos que você deseja, como todos os arquivos XML, em um determinado diretório. Apesar de Dir.blog é gostar expressões regulares, não é. É muito limitado em comparação com Rubiexpressões regulares e está mais estreitamente relacionado aos curingas de expansão de shell.

O oposto de globbing, iterando sobre todos os arquivos em um diretório, pode ser feito com o Dir.foreach método.

Exemplo

O glob a seguir corresponderá a todos os arquivos que terminam em .rb no diretório atual. Ele usa um único curinga, o asterisco. O asterisco corresponderá a zero ou mais caracteres, portanto, qualquer arquivo que termine em .rb corresponderá a este globo, incluindo um arquivo chamado simplesmente .rb, sem nada antes da extensão do arquivo e do período anterior. O método glob retornará todos os arquivos que correspondem às regras de globbing como uma matriz, que pode ser salva para uso posterior ou repetida.

 #! / usr / bin / env ruby


 Dir.glob ('*. Rb'). Each do | f |

 coloca f

 fim

instagram viewer

Curingas e Mais

Existem apenas alguns curingas para aprender:

  • * - Combine zero ou mais caracteres. Um globo composto apenas pelo asterisco e nenhum outro caractere ou curinga corresponderá a todos os arquivos no diretório atual. O asterisco geralmente é combinado com uma extensão de arquivo, se não houver mais caracteres para restringir a pesquisa.
  • ** - Combine todos os diretórios recursivamente. Isso é usado para descer na árvore de diretórios e encontrar todos os arquivos nos subdiretórios do diretório atual, em vez de apenas arquivos no diretório atual. Esse curinga é explorado no código de exemplo abaixo.
  • ? - Combine qualquer personagem. Isso é útil para localizar arquivos cujo nome esteja em um formato específico. Por exemplo, 5 caracteres e uma extensão .xml podem ser expressos como ... xml.
  • [a-z] - Combine qualquer caractere no conjunto de caracteres. O conjunto pode ser uma lista de caracteres ou um intervalo separado pelo caractere hífen. Os conjuntos de caracteres seguem a mesma sintaxe e se comportam da mesma maneira que os conjuntos de caracteres em expressões regulares.
  • {a, b} - Corresponder o padrão a ou b. Embora isso pareça um quantificador de expressão regular, não é. Por exemplo, na expressão regular, o padrão a {1,2} corresponderá a 1 ou 2 caracteres 'a'. No globbing, ele corresponderá à corda a1 ou a2. Outros padrões podem ser aninhados dentro dessa construção.

Uma coisa a considerar é sensibilidade do caso. Cabe ao sistema operacional determinar se TEST.txt e Teste. TXT consulte o mesmo arquivo. No Linux e outros sistemas, esses são arquivos diferentes. No Windows, eles se referirão ao mesmo arquivo.

O sistema operacional também é responsável pela ordem em que os resultados são exibidos. Pode ser diferente se você estiver no Windows versus Linux, por exemplo.

Uma última coisa a se notar é a Dir [globstring] método de conveniência. É funcionalmente o mesmo que Dir.glob (cadeia de caracteres) e também é semanticamente correto (você está indexando um diretório, como uma matriz). Por esse motivo, você pode ver Dir [] Mais frequentemente do que Dir.glob, mas eles são a mesma coisa.

Exemplos usando caracteres curinga

O programa de exemplo a seguir demonstrará o maior número possível de padrões em muitas combinações diferentes.

 #! / usr / bin / env ruby


 # Obter todos os arquivos .xml

 Dir ['*. Xml']


 # Obtenha todos os arquivos com 5 caracteres e uma extensão .jpg

 Dir ['... jpg']


 # Obtenha todas as imagens jpg, png e gif

 Dir ['*. {Jpg, png, gif}']


 # Desça na árvore de diretórios e obtenha todas as imagens jpg

 # Nota: isso também arquivará imagens jpg no diretório atual

 Dir ['** / *. Jpg']


 # Desça em todos os diretórios começando com o Uni e encontre todos

 # imagens jpg.

 # Nota: isso desce apenas um diretório

 Dir ['Uni ** / *. Jpg']


 # Desça para todos os diretórios que começam com Uni e todos

 # subdiretórios de diretórios que começam com Uni e localizam

 # todas as imagens .jpg

 Dir ['Uni ** / ** / *. Jpg']