2017-02-15 1 views
0

Ich versuche, eine Datei-Suche-Dienstprogramm in Ruby, die eine Liste von Dateinamen in einer TXT-Datei gefunden sucht und sucht meinen ganzen Computer für diese Dateien. Wenn eine dieser Dateien gefunden wird, wird die Datei in ein anderes Verzeichnis verschoben (effektiv aus dem Verzeichnis gelöscht, in dem sie gefunden wurde).Warum ist Dir.glob nur die letzte Datei in Schleife

Die Suche muss alle Ordner von oben nach unten durchlaufen. Bis jetzt habe ich den folgenden Code:

File.open("sample-file-list.txt") do |name| # open file with 
    name.each_line do |file_name| 
     puts "here is the file I want to look for: #{file_name}" 

     folder = "/Users/bob/code/find-file" 
     Dir.glob("#{folder}/**/#{file_name}") do |file| 
      puts "now I am working on #{file}" 
     end 
    end 
end 

Die Probe-Datei-list.txt Datei hat diese Einträge:

 
0001.txt 
0002.txt 

im Ordner oben ich die Datei mit dem Namen „0001.txt“ habe. Ich habe auch einen Unterordner im Ordner namens "subdir", der die Datei "0002.txt" enthält.

Wenn ich die Ruby-Datei im Terminal laufen die Ergebnisse, die ich bekommen sind:

 
here is the file I want to look for: 0001.txt 
here is the file I want to look for: 0002.txt 
now I am working on /Users/bob/code/find-file/subdir/0002.txt 

nur Mein Code setzt in der 0002.txt die letzte Datei findet. Aber es scheint die 0001.txt Datei aus irgendeinem Grund zu überspringen.

Als eine Randnotiz verwende ich eher nicht Dir.glob, da es eine Menge Dateien sein wird, aber Dir.each geht nicht durch Unterverzeichnisse mindestens ich kann nicht scheinen, um es zu bekommen - aber das ist ein anderes Problem.

Jede Hilfe wird geschätzt.

+1

Einrückung ist wichtig für das Verständnis, besonders auf einen Blick. Versuchen Sie, Ihren Code so strukturiert wie möglich in Fragen zu halten, um Zweideutigkeiten oder Verwirrung zu vermeiden. – tadman

+0

Wenn Sie Leistungsprobleme haben, ist es am besten, 'Dir.glob (" **/* ") einmal zu holen, dann benutzen Sie' grep', um Dateien in dieser Liste zu finden. – tadman

+0

Ich werde in Zukunft vorsichtiger sein. Vielen Dank. – simplytrue

Antwort

1

Neben dem Dateinamen, den Sie suchen, enthält jede Zeile der Datei, die Sie lesen, auch eine neue Zeile, vermutlich \n. Dies wird in der Zeichenfolge enthalten, die Sie von each_line erhalten.

Die Antwort ist also:

1) Verwenden Sie file_name.strip als Suchbegriff so dass jede zusätzliche Leerzeichen, die nicht wirklich Teil der gewünschten Dateinamen aus wird getrimmt ist. Andernfalls schlägt Dir.glob fehl, da am Ende nach einer Datei/einem Muster mit Zeilenumbruch gesucht wird.

2) Die letzte Datei in Ihrem Testfall wird gefunden, weil Sie am Ende der Datei keinen Zeilenumbruch haben. Wenn Sie eine hinzufügen (dh die letzte Zeile der Datei ist leer), findet das Skript nicht einmal die letzte tatsächliche Datei in der Liste.

+0

danke für die Antwort. das Hinzufügen von file_name.strip hat funktioniert. Jetzt auf den Rest des Dienstprogramms. – simplytrue

Verwandte Themen