Как мне написать цикл в ruby, чтобы я мог выполнить блок кода для каждого файла?
Я новичок в ruby, и я пришел к выводу, что способ сделать это - сделать каждый цикл.
Файл ruby будет выполняться из каталога, отличного от каталога, через который я хочу перейти.
Я попробовал, Dir.foreach
и я не мог заставить его работать.
ruby
directory
filesystems
Андрей
источник
источник
Dir.foreach
работает, чтобы перебрать содержимое каталога, так что еще много чего происходит.do_something_with(entry) if File.file?(entry)
'img/*.{jpg,png,gif,jpeg}'
чтобы получить несколько расширений.Ответы:
Как уже говорили другие,
Dir::foreach
это хороший вариант здесь. Однако учтите, чтоDir::foreach
иDir::entries
всегда будет включать.
и..
(текущий и родительский каталоги). Как правило, вы не захотите работать с ними, поэтому вы можете использоватьDir::each_child
илиDir::children
(как предложено ma11hew28 ) или сделать что-то вроде этого:Dir::foreach
иDir::entries
(а такжеDir::each_child
иDir::children
) также включает скрытые файлы и каталоги. Часто это то, что вы хотите, но если это не так, вам нужно что-то сделать, чтобы пропустить их.В качестве альтернативы вы можете посмотреть,
Dir::glob
что обеспечивает простое сопоставление с подстановочными знаками:источник
Dir.foreach
если каталог содержит огромное количество файлов!next if File.directory? item
.
или..
потому, что люди почти всегда хотят игнорировать эти два.Dir.foreach
а не создает (потенциально огромный) массив заранее (чтоDir.glob
делает). Так что если каталог действительно огромный, это может повлиять на производительность. При нормальных обстоятельствах вы не заметите, но в стрессовых условиях это может иметь значение.Это мой любимый метод простоты чтения:
И вы даже можете расширить это для работы со всеми файлами в подкаталогах:
источник
Dir также имеет более короткий синтаксис для получения массива всех файлов из каталога:
источник
fname
с итерациями?источник
Библиотека find специально разработана для этой задачи: https://ruby-doc.org/stdlib-2.5.1/libdoc/find/rdoc/Find.html.
Это стандартная библиотека ruby, поэтому она должна быть доступна
источник
File.find
идет рекурсивно вниз, насколько это возможно, начиная с любого пути, который вы ему дадите. Я не уверен, что именно этого хочет ОП.*.rb
кfind()
Мне нравится этот, который не был упомянут выше.
Преимущество состоит в том, что вместо строки вы получаете объект Pathname, с которым вы можете делать полезные вещи и проходить дальше.
источник
источник
Dir.foreach
выполняет итерации, в то время какDir.entries
строит весь массив одновременно. Так что, если каталог огромен, это меньше попадания в память. (Не обычно большое дело, вероятно, но все же ...)Чтобы пропустить
.
&..
, вы можете использоватьDir::each_child
.Dir::children
возвращает массив имен файлов.источник