Bu çoğunlukla konu dışı, ancak kullanabilirsiniz
find -maxdepth 1 -type f -name '*.txt' | xargs python -c '
import fileinput
for line in fileinput.input(inplace=True):
print line.replace("blah", "blee"),
'
Buradaki ana fayda ... xargs ... -I {} ... sed ...
hızdır: sed
10 milyon kez çağırmaktan kaçınırsınız . Python kullanmaktan kaçınabilmeniz daha hızlı olurdu (python nispeten yavaş, nispeten), bu yüzden perl bu görev için daha iyi bir seçim olabilir. Eşdeğeri perl ile nasıl rahatça yapacağımdan emin değilim.
Bunun çalışma şekli, xargs
Python'u tek bir komut satırına sığabilecek kadar çok argümanla çağıracak ve argümanları bitene kadar (bunlar tarafından sağlanır ls -f *.txt
) yapmaya devam etmesidir . Her bir çağrının argümanlarının sayısı dosya adlarının uzunluğuna ve diğer bazı şeylere bağlı olacaktır. fileinput.input
Fonksiyon her çağırma en argümanlar adlı dosyalardan ardışık satırları verir ve inplace
opsiyon sihirli "yakalamak" çıkışı ve her satırı değiştirmek için kullanın söyler.
Python'un dize replace
yönteminin regexps kullanmadığını unutmayın; eğer bunlara ihtiyacınız varsa, kullanmanız import re
ve kullanmanız gerekir print re.sub(line, "blah", "blee")
. Bunlar, Perl-Uyumlu RegExps'tir ve bunlar, aldıklarınızın oldukça güçlendirilmiş versiyonlarıdır sed -r
.
Düzenle
Akira yorumlarda belirtildiği gibi, komut ls -f *.txt
yerine bir glob ( ) kullanan orijinal sürüm find
çalışmaz çünkü globlar shell ( bash
) tarafından işlenir . Bu, komut çalıştırılmadan önce, komut satırına 10 milyon dosya adının değiştirileceği anlamına gelir. Bu, bir komutun bağımsız değişken listesinin maksimum boyutunu aşacağı garantilidir. Bununla xargs --show-limits
ilgili sisteme özgü bilgiler için kullanabilirsiniz .
Argüman listesinin maksimum boyutu da dikkate alınır xargs
, bu da bu limite göre her bir python çağrısına geçirdiği argüman sayısını sınırlar. Yana xargs
hala Python oldukça birkaç kez çağırmak zorunda kalacak, akira önerisi kullanmak os.path.walk
muhtemelen kurtarmayacaksa biraz zaman listeleme dosyasını almak için.
sed
Her dosya için çağırmaktan kaçınırsanız daha hızlı olur . Bir dizi dosyayı açmanın, düzenlemenin, kaydetmenin ve kapatmanın bir yolu olup olmadığından emin değilimsed
; hız gerekliyse, belki perl veya python gibi farklı bir program kullanmak isteyebilirsiniz.