Obtenez les noms de tous les fichiers à partir D'un dossier avec Ruby

je veux obtenir tous les noms de fichiers d'un dossier en utilisant Ruby.

284
demandé sur Željko Filipin 2009-11-18 15:33:47

14 réponses

vous avez aussi l'option de raccourci de

Dir["/path/to/search/*"]

et si vous voulez trouver tous les fichiers Ruby dans n'importe quel dossier ou sous-dossier:

Dir["/path/to/search/**/*.rb"]
430
répondu Ian Eccles 2009-11-18 13:02:29
Dir.entries(folder)

exemple:

Dir.entries(".")

Source: http://ruby-doc.org/core/classes/Dir.html#method-c-entries

143
répondu Željko Filipin 2015-07-01 08:43:48

les extraits suivants montrent exactement le nom des fichiers à l'intérieur d'un répertoire, sautant les sous-répertoires et "." , ".." dossiers en pointillés:

Dir.entries("your/folder").select {|f| !File.directory? f}
82
répondu Emiliano Poggi 2015-11-12 19:21:43

pour obtenir tous les fichiers (strictement fichiers seulement) récursivement:

Dir.glob('path/**/*').select{ |e| File.file? e }

ou tout ce qui n'est pas un répertoire ( File.file? rejetterait les fichiers non-réguliers):

Dir.glob('path/**/*').reject{ |e| File.directory? e }

Alternative Solution

utilisant Find#find sur une méthode de recherche basée sur un modèle comme Dir.glob est en fait mieux. Voir cette réponse à "One-liner Récursive de la Liste des Répertoires en Ruby?" .

30
répondu konsolebox 2017-05-23 12:02:56

personnellement, J'ai trouvé cela le plus utile pour boucler des fichiers dans un dossier, la sécurité prospective:

Dir['/etc/path/*'].each do |file_name|
  next if File.directory? file_name 
end
8
répondu mr.buttons 2015-11-12 19:20:14

ça marche pour moi:

si vous ne voulez pas de fichiers cachés[1], utilisez Dir [] :

# With a relative path, Dir[] will return relative paths 
# as `[ './myfile', ... ]`
#
Dir[ './*' ].select{ |f| File.file? f } 

# Want just the filename?
# as: [ 'myfile', ... ]
#
Dir[ '../*' ].select{ |f| File.file? f }.map{ |f| File.basename f }

# Turn them into absolute paths?
# [ '/path/to/myfile', ... ]
#
Dir[ '../*' ].select{ |f| File.file? f }.map{ |f| File.absolute_path f }

# With an absolute path, Dir[] will return absolute paths:
# as: [ '/home/../home/test/myfile', ... ]
#
Dir[ '/home/../home/test/*' ].select{ |f| File.file? f }

# Need the paths to be canonical?
# as: [ '/home/test/myfile', ... ]
#
Dir[ '/home/../home/test/*' ].select{ |f| File.file? f }.map{ |f| File.expand_path f }

Maintenant, Dir.les entrées retourneront les fichiers cachés, et vous n'avez pas besoin du Joker Astérix (vous pouvez simplement passer la variable avec le nom du répertoire), mais il retournera le nom de base directement, donc le fichier.les fonctions xxx ne fonctionneront pas.

# In the current working dir:
#
Dir.entries( '.' ).select{ |f| File.file? f }

# In another directory, relative or otherwise, you need to transform the path 
# so it is either absolute, or relative to the current working dir to call File.xxx functions:
#
home = "/home/test"
Dir.entries( home ).select{ |f| File.file? File.join( home, f ) }

[1] .dotfile sur unix, je n'ai pas savoir sur Windows

8
répondu 2016-07-04 00:33:04

C'est une solution pour trouver des fichiers dans un répertoire:

files = Dir["/work/myfolder/**/*.txt"]

files.each do |file_name|
  if !File.directory? file_name
    puts file_name
    File.open(file_name) do |file|
      file.each_line do |line|
        if line =~ /banco1/
          puts "Found: #{line}"
        end
      end
    end
  end
end
7
répondu gilcierweb 2016-02-20 20:44:08

tout en obtenant tous les noms de fichiers dans un répertoire, cet extrait peut être utilisé pour rejeter à la fois les répertoires [ . , .. ] et les fichiers cachés qui commencent par un .

files = Dir.entries("your/folder").reject {|f| File.directory?(f) || f[0].include?('.')}
3
répondu Lahiru 2015-11-12 19:18:56

dans Ruby 2.5, vous pouvez maintenant utiliser Dir.children . Il obtient des noms de fichiers comme tableau sauf pour "." et." ."

exemple:

Dir.children("testdir")   #=> ["config.h", "main.rb"]

http://ruby-doc.org/core-2.5.0/Dir.html#method-c-children

3
répondu Mario Pérez 2018-04-02 11:53:24

C'est ce qui fonctionne pour moi:

Dir.entries(dir).select { |f| File.file?(File.join(dir, f)) }

Dir.entries renvoie un tableau de chaînes. Ensuite , nous devons fournir un chemin complet du fichier vers File.file? , à moins que dir ne soit égal à notre répertoire courant. C'est pourquoi ce File.join() .

2
répondu yegor256 2017-08-28 16:08:26

si vous voulez obtenir un tableau de noms de fichiers incluant les liens symboliques , utilisez

Dir.new('/path/to/dir').entries.reject { |f| File.directory? f }

ou même

Dir.new('/path/to/dir').reject { |f| File.directory? f }

et si vous voulez aller sans liens symboliques , utilisez

Dir.new('/path/to/dir').select { |f| File.file? f }

comme indiqué dans d'autres réponses, utilisez Dir.glob('/path/to/dir/**/*') au lieu de Dir.new('/path/to/dir') si vous voulez obtenir tous les fichiers de façon récursive.

1
répondu Mike 2017-01-04 18:05:12
def get_path_content(dir)
  queue = Queue.new
  result = []
  queue << dir
  until queue.empty?
    current = queue.pop
    Dir.entries(current).each { |file|
      full_name = File.join(current, file)
      if not (File.directory? full_name)
        result << full_name
      elsif file != '.' and file != '..'
          queue << full_name
      end
    }
  end
  result
end

renvoie les chemins relatifs du fichier à partir du répertoire et de tous les sous-répertoires

0
répondu punksta 2016-06-21 08:43:38
Dir.new('/home/user/foldername').each { |file| puts file }
0
répondu Ashwin 2017-01-06 07:36:11

vous pouvez également utiliser Rake::FileList (à condition que vous ayez la" dépendance 151920920"):

FileList.new('lib/*') do |file|
  p file
end

selon L'API:

les listes sont paresseuses. Lorsqu'on lui donne une liste des modèles de globes pour possible les fichiers à inclure dans la liste des fichiers, au lieu de chercher le fichier structures pour trouver les fichiers, une liste de fichiers contient le motif pour ces derniers utiliser.

https://docs.ruby-lang.org/en/2.1.0/Rake/FileList.html

0
répondu Artur Beljajev 2017-10-24 10:32:48