Como escrevo um loop em ruby para poder executar um bloco de código em cada arquivo?
Eu sou novo no ruby e concluí que a maneira de fazer isso é fazer cada loop.
O arquivo ruby será executado a partir de um diretório diferente do diretório em que desejo executar o loop.
Eu tentei o Dir.foreach
e não consegui fazê-lo funcionar.
ruby
directory
filesystems
Andrew
fonte
fonte
Dir.foreach
trabalha para iterar sobre o conteúdo de um diretório, para que outras coisas estejam acontecendo.do_something_with(entry) if File.file?(entry)
'img/*.{jpg,png,gif,jpeg}'
para pegar várias extensões.Respostas:
Como outros já disseram,
Dir::foreach
é uma boa opção aqui. No entanto, observe queDir::foreach
eDir::entries
sempre incluirá.
e..
(os diretórios atual e pai). Geralmente, você não deseja trabalhar neles, portanto, pode usarDir::each_child
ouDir::children
(como sugerido por ma11hew28 ) ou fazer algo como isto:Dir::foreach
eDir::entries
(assim comoDir::each_child
eDir::children
) também incluem arquivos e diretórios ocultos. Muitas vezes, é isso que você deseja, mas se não for, precisará fazer algo para ignorá-las.Como alternativa, convém pesquisar
Dir::glob
quais fornecem correspondência simples de curinga:fonte
Dir.foreach
se o diretório contiver um grande número de arquivos!next if File.directory? item
.
ou..
porque as pessoas quase sempre querem ignorar essas duas.Dir.foreach
itera em vez de criar uma matriz (potencialmente enorme) na frente (o queDir.glob
faz). Portanto, se o diretório for realmente grande, poderá fazer uma diferença de desempenho. Em circunstâncias normais, você não notaria, mas sob condições de estresse, isso pode ser absolutamente importante.Este é o meu método favorito para facilitar a leitura:
E você pode até estender isso para trabalhar em todos os arquivos em subdiretórios:
fonte
Dir também possui sintaxe mais curta para obter uma matriz de todos os arquivos do diretório:
fonte
fname
as iterações?fonte
A biblioteca de localização foi projetada especificamente para esta tarefa: https://ruby-doc.org/stdlib-2.5.1/libdoc/find/rdoc/Find.html
Esta é uma biblioteca ruby padrão, portanto deve estar disponível
fonte
File.find
desce recursivamente o máximo que pode, começando de qualquer caminho que você indicar. Não tenho certeza de que é isso que o OP quer.*.rb
afind()
Eu gosto deste, que não foi mencionado acima.
O benefício é que você obtém um objeto Pathname em vez de uma string, para poder fazer coisas úteis e percorrer mais adiante.
fonte
fonte
Dir.foreach
itera enquantoDir.entries
cria toda a matriz de uma só vez. Portanto, se o diretório é imenso, é menos um problema de memória. (Geralmente não um grande negócio, provavelmente, mas ainda assim ...)Para pular
.
&..
, você pode usarDir::each_child
.Dir::children
retorna uma matriz dos nomes de arquivos.fonte