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:
- 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.
- 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.
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.
, 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) –
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. –
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