2010-07-08 12 views

Répondre

21
Dir.glob("a_directory/*/").max_by {|f| File.mtime(f)} 

Dir.glob("a_directory/*/") retourne tous les noms de répertoires dans a_directory (sous forme de chaînes) et max_by renvoie le nom du répertoire pour lequel File.mtime retourne la plus grande date (à savoir la plus récente).

Edit: mise à jour de réponse pour correspondre à la question mise à jour

+0

Je suis à la recherche pour savoir comment trouver le dernier dossier modifié plutôt que le fichier, donc File.new jette et erreur, et il n'y a pas Dir.mtime – Dasmowenator

+0

@ Sam: 'File.new' ne apparaît n'importe où dans mon code et 'File.mtime' fonctionne très bien avec un nom de répertoire en tant qu'argument. N'essayez pas de "réparer" mon code, cela fonctionne tel quel. – sepp2k

+0

Ceci est très proche du travail, mais Dir.glob() retourne les répertoires ET les fichiers, et je ne veux que des répertoires. J'ai trouvé que Dir.glob ("*"). Delete_if {| entrée | entrée.include? "."}. max_by {| f | File.mtime (f)} fonctionne pour cela, mais il suppose qu'aucun de vos répertoires ne contient de points ... – Dasmowenator

1

Trouvez le répertoire le plus récemment modifié dans le répertoire courant:

folders = Dir["*"].delete_if{|entry| entry.include? "."} 
newest = folders[0] 
folders.each{|folder| newest = folder if File.mtime(folder) > File.mtime(newest)} 
1

expansion au large de la réponse de sepp2k un peu pour ajouter une vérification récursive tous les sous-répertoires pour les à venir à travers ceci:

#!/usr/bin/env ruby 
if ARGV.count != 1 then raise RuntimeError, "Usage: newest.rb '/path/to/your dir'" end 

Dir.chdir(ARGV[0]) 
newest_file = Dir.glob("**/").max_by {|f| File.mtime(f)} 

if newest_file != nil then 
puts newest_file.to_s + " " + File.mtime(newest_file).to_s 
else 
puts "No subdirectories" 
end 

et utilisez plutôt si vous voulez que tous les fichiers et répertoires non seulement:

Dir.glob("**/*") 
Questions connexes