2016-03-28 27 views
-2

Belirli kelimeler için .feature ile biten dosyaları aramalıyım (POST, GET, PUT ve DELETE). .feature dosyalarını ayırabildim, ancak yukarıdaki sözcükleri içeren dosyaları bulamıyorum.Belirli bir dizeyi dosya adları listesi arasında nasıl bulabilirim?

featureLocation = puts Dir.glob "**/*.feature" # show all feature files 
puts featureLocation 

Henüz kelimeleri ama hiçbir şans bulmak için her dosya yineleme yapmak için çeşitli yollar denedi:

Ben .feature dosyaları göstermek için aşağıdaki kullanılır.

+0

, nil değerini döndürür, bu nedenle koçların iadesini atamak, "featureLocation" (sıfır) yapar. Ayrıca ruby'de "feature_locations" ifadesini kullanmalısınız (snake_case, camelCase değil) –

+0

Ne "çeşitli yollar" denediniz? Neden çalışmadılar? Lütfen "[mcve]" yi okuyun. Çabalarını görmemiz gerek. Ayrıca, Ruby değişkenleri de camelCase değil, snake_case. Ruby Java değil. –

+1

Ne istediğinizi net değil. Dosyalarda bulunan sözcükleri (dördü) veya bu sözcükleri içeren dosyaları bulmak ister misiniz? Ve başlığınız bile 'POST',' GET' vb. Içeren dosya adlarını bulmak istediğinizi ima edebilir. – sawa

cevap

0
files = Dir.glob('**/*.feature') 

files.each do |name| 
    if File.read(name).include?('CERTAIN WORD') 
    # DO SOMETHING WITH THE FAILE 
    end 
end 

Sen (yeni içerikle tasarrufu, okuma değiştirme) Buna benzer bir içerik değiştirebilirsiniz:

content = File.read(name) 
new_content = content.gsub(/SOME PATTERN/, 'REPLACEMENT') 
File.open(name, 'w') { |file| file << new_content } 
+0

Çok teşekkür ederim, mükemmel ve dosyamda belirli bir kelimeyi nasıl bulacağımı da anladım ama sadece bana "senaryo" kelimesinin ilk örneğini gösteriyor ve bunun tonlarca örneği var. her birini düzenleyin (sonunda amaç) ... bunu yapmak için basit bir yol var mı ?: str = Dosya.read ("... POST_Win.feature") # "Senaryo" kelimesinin ilk örneği match = str.scan (/ [0-9A-Za-z] {8,8} /) maçı [1] bir ton koyar! –

+0

Güncelleme. Eğer birden fazla eşleşme bulmak istiyorsanız, '' match '' –

+0

'yerine '' scan '' kullanın, ancak" bana "senaryosunun" ilk örneğini gösterir ve bunun tonlarca örneği vardır. " soruda, bir yorum değil. Sorduğunuzda lütfen tüm gereksinimleri belirtin. Bunu yapmamak size yardım etmeyi zorlaştırıyor. Lütfen "[sor]" yazınız. –

0

Bunu yapmanın birden çok yolu vardır. Bu denenmemiş, ama burada bu konuda giderdim nasıl özü var:

require 'find' 

REPLACEMENTS = { 
    'target1' => 'replacement1', 
    'target2' => 'replacement2' 
} 

Find.find('./somedir') do |path| 
    next if File.directory?(path) 
    next unless File.extname(path) == '.feature' 

    new_path = path + '.new' 
    File.open(new_path, 'w') do |fo| 
    File.foreach(path) do |line| 
     REPLACEMENTS.each do |t, r| 
     line.gsub!(t, r) 
     end 
     fo.puts line 
    end 
    end 

    old_path = path + '.old' 
    File.rename(path, old_path) 
    File.rename(new_path, path) 
    # File.unlink(old_path) 
end 

bir kuruluştaki üretim kodu yazarken ben önemli gördüğünüz birkaç şey vardır:

  1. Yaz kodu ölçeklenebilir . Bu, bir dosyanın beklediğinizden çok daha büyük olması durumunda ölmeyeceği veya bir taramaya gideceği anlamına gelir. File.foreach, çok sayıda insanın daha yavaş çalıştığı veya daha fazla çalışma gerektirdiği anlamına gelen satır içi dosyaları okur. Dosya I/O'yu sınama, özellikle slurping files vs. line-by-line, dosya boyutları büyüdükçe, read (AKA slurping) işleminin büyük ölçüde yavaşladığını gösterir. Kesinlikle emin değilseniz, dosyalarınız asla 1MB'yi aşmayacak, foreach'u kullanın.
  2. Hedef sözcüklerinizi ve bunların yer değiştirmelerini içermek için güzel bir başlangıç ​​yapısı kullanın. Bir Hash, hedefler/anahtarlar alt dizeler veya normal ifadeler olabileceğinden iyi bir başlangıç ​​noktasıdır. Normal ifadelerin açıklanması bu soru için konu dışıdır, ancak Ruby ve gsub and regular expressions, karma bir anahtar olarak büyük bir kombinasyon oluşturur. Burada nasıl yapılacağını gösteren birçok cevap var ve belgelerin örnekleri var.
  3. Find.find iyi bilinmemektedir; İnsanlar Dir[...] veya Dir.glob'a atlamak eğilimindedir ancak Bul'u tercih ederim. Dokümantasyonun nasıl kullanılacağına dair güzel bir örneği var. Bulmak özellikle daha büyük dizinlerde yürümeniz gerektiğinde daha iyi ölçeklenmiş gibi görünüyor. Dosyaları değiştirme ve kaydetme işlemi genellikle güvenli bir şekilde yapılmaz; çünkü insanlar kodlarını veya sistemlerini asla harekete geçmeyeceklerini varsaymaktadır. Bu iyi bir varsayım değil. Bu kod yeni bir dosya açar, ardından eski satır-by-line'ı okur. Her satır için hedefler aranır ve değiştirilir, sonra satır yeni dosyaya yazılır. Eski dosya işlendikten sonra yeni dosya kapatılır (open ile bir blok kullanarak bir yan ürün olarak). Sonra eski dosya yeniden adlandırılır, yeni dosya eski dosyanın adına yeniden adlandırılır. Bu bir arıza olması durumunda yerinde bir yedek bırakıyor. Ardından, isteğe bağlı olarak eski dosyayı silebilirsiniz.

Bu, çok düşük yükte sonuçlanır, çok hızlı çalışır ve iyi ölçeklenmeli/büyütülmelidir.

Ayrıca olmak kolayca komut satırı araçlarını find ve * nix sed kullanılarak gerçekleştirilebilir ve nasıl kolayca bazı şaşırtıcı olarak çok hızlı koşmak ve son derece ölçeklenebilir olması, nedenle de bu yolu araştırma iyidir edeceğiz Bu görev dosya görevleri, komut isteminde veya bir komut dosyasında yapılabilir.

İlgili konular