Я хочу получить все имена файлов из папки, используя Ruby.
358
У вас также есть опция ярлыка
Dir["/path/to/search/*"]
и если вы хотите найти все файлы Ruby в любой папке или подпапке:
Dir["/path/to/search/**/*.rb"]
./...
а не~/
./
означает текущий каталог, тогда как/
является корневой точкой монтирования и~/
домашним каталогом пользователя. Если вы переместите весь проект куда-то еще, первый будет работать, но два других, вероятно, не будут.пример:
Источник: http://ruby-doc.org/core/classes/Dir.html#method-c-entries
источник
Dir#glob
можно было бы упомянуть), ничто не мешает кому-то еще опубликовать действительно хороший ответ. Конечно, я в основном "наполовину полный стакан", парень ...Dir
редко, и каждый раз, когда мне это нужно, мне приходится читать документацию. Я разместил здесь свой вопрос и ответ, чтобы найти его позже и, возможно, даже помочь кому-нибудь с тем же вопросом. Я думаю, что я слышал в SO подкасте, что нет ничего плохого в таком поведении. Если у вас есть лучший ответ, пожалуйста, напишите его. Я опубликовал то, что я знаю, я не Рубин ниндзя. Я регулярно принимаю ответы с наибольшим количеством голосов.Dir[]
или ,Dir.glob
если аргумент является переменной. Когдаpath = '/tmp'
, сравните:Dir.glob("#{path}/*")
противDir.entries(path)
. Возвращаемые значения немного отличаются («.», «..»), но последние легче понять с первого взгляда.Следующие фрагменты точно показывает имена файлов внутри каталога, пропустив подкаталоги и
"."
,".."
пунктирными папки:источник
...select {|f| File.file? f}
для более ясного значения и более короткого синтаксиса.Dir.entries("your/folder").select {|f| File.file? f}
!File.directory?
работает, ноFile.file?
нет..reject {|f| File.directory? f}
кажется чище чем.select{|f| !File.directory? f}
. Ох, и теперь я вижу первый комментарий ... тоже хорошо.Чтобы получить все файлы (только файлы) рекурсивно:
Или все, что не является каталогом (
File.file?
будет отклонять нестандартные файлы):Альтернативное решение
Использование
Find#find
более подходящего метода поиска, основанного на шаблонах, наDir.glob
самом деле лучше. См. Этот ответ на вопрос: «Однострочное обращение к каталогам рекурсивного списка в Ruby?» ,источник
Это работает для меня:
Если вам не нужны скрытые файлы [1], используйте Dir [] :
Теперь Dir.entries вернет скрытые файлы, и вам не понадобится подстановочный знак звездочки (вы можете просто передать переменную с именем каталога), но он вернет базовое имя напрямую, поэтому функции File.xxx не будут работать ,
[1]
.dotfile
на Unix, я не знаю, о Windowsисточник
В Ruby 2.5 теперь можно использовать
Dir.children
. Он получает имена файлов в виде массива, кроме "." а также ".."Пример:
http://ruby-doc.org/core-2.5.0/Dir.html#method-c-children
источник
Лично я нашел это наиболее полезным для зацикливания файлов в папке, ориентированной на будущее:
источник
Это решение для поиска файлов в каталоге:
источник
Получая все имена файлов в каталоге, этот фрагмент можно использовать для отклонения как каталогов [
.
,..
], так и скрытых файлов, начинающихся с.
источник
Dir.entries
возвращает локальные имена файлов, а не абсолютные пути к файлам. С другой стороны,File.directory?
ожидает абсолютный путь к файлу. Этот код не работает должным образом.этот код возвращает только имена файлов с их расширением (без глобального пути)
источник
Это то, что работает для меня:
Dir.entries
возвращает массив строк. Затем мы должны указать полный путь к файлуFile.file?
, если онdir
не равен нашему текущему рабочему каталогу. Вот почему этоFile.join()
.источник
Вы также можете использовать
Rake::FileList
(если у вас естьrake
зависимость):Согласно API:
https://docs.ruby-lang.org/en/2.1.0/Rake/FileList.html
источник
Если вы хотите получить массив имен файлов, включая символические ссылки , используйте
или даже
и если вы хотите обойтись без символических ссылок , используйте
Как показано в других ответах, используйте
Dir.glob('/path/to/dir/**/*')
вместо,Dir.new('/path/to/dir')
если вы хотите получить все файлы рекурсивно.источник
*.*
источник
В дополнение к предложениям в этой теме я хотел бы упомянуть, что если вам нужно также возвращать точечные файлы (.gitignore и т. Д.), То в Dir.glob вам нужно будет включить флаг следующим образом:
Dir.glob("/path/to/dir/*", File::FNM_DOTMATCH)
по умолчанию Dir.entries включает в себя точечные файлы, а также текущие родительские каталоги.Для всех, кому было интересно, мне было любопытно, как ответы здесь сравниваются друг с другом во время выполнения, вот результаты против глубоко вложенной иерархии. Первые три результата не являются рекурсивными:
Они были сгенерированы с помощью следующего сценария тестирования:
Различия в количестве файлов обусловлены
Dir.entries
включением скрытых файлов по умолчанию.Dir.entries
в этом случае потребовалось немного больше времени из-за необходимости перестроить абсолютный путь к файлу, чтобы определить, является ли файл каталогом, но даже без этого он все еще занимал значительно больше времени, чем другие параметры в рекурсивном случае. Это все с использованием ruby 2.5.1 на OSX.источник
Один простой способ может быть:
источник
возвращает относительные пути файла из каталога и всех подкаталогов
источник
В контексте IRB вы можете использовать следующее для получения файлов в текущем каталоге:
Вы можете сделать эту работу и в других каталогах:
источник