Ini sebagian besar di luar topik, tetapi Anda dapat menggunakannya
find -maxdepth 1 -type f -name '*.txt' | xargs python -c '
import fileinput
for line in fileinput.input(inplace=True):
print line.replace("blah", "blee"),
'
Manfaat utama di sini (lebih ... xargs ... -I {} ... sed ...) adalah kecepatan: Anda menghindari meminta sed10 juta kali. Akan lebih cepat lagi jika Anda bisa menghindari menggunakan Python (karena python agak lambat, relatif), jadi perl mungkin merupakan pilihan yang lebih baik untuk tugas ini. Saya tidak yakin bagaimana melakukan yang setara dengan nyaman dengan perl.
Cara ini bekerja adalah yang xargsakan memanggil Python dengan argumen sebanyak yang dapat ditampung pada satu baris perintah, dan terus melakukan itu sampai kehabisan argumen (yang dipasok oleh ls -f *.txt). Jumlah argumen untuk setiap doa akan tergantung pada panjang nama file dan, um, beberapa hal lainnya. Itufileinput.input Fungsi menghasilkan garis berurutan dari file bernama dalam argumen setiap permintaan ini, dan inplacepilihan mengatakan itu untuk ajaib "menangkap" output dan menggunakannya untuk mengganti setiap baris.
Perhatikan bahwa replacemetode string Python tidak menggunakan regexps; jika Anda membutuhkannya, Anda harus import redan menggunakannya print re.sub(line, "blah", "blee"). Mereka adalah Perl-Compatible RegExps, yang merupakan semacam versi yang sangat dijaga dari yang Anda dapatkansed -r .
sunting
Seperti akira menyebutkan dalam komentar, versi asli menggunakan glob ( ls -f *.txt) sebagai ganti findperintah tidak akan berfungsi karena gumpalan diproses oleh shell ( bash) itu sendiri. Ini berarti bahwa bahkan sebelum perintah dijalankan, 10 juta nama file akan diganti ke dalam baris perintah. Ini cukup dijamin untuk melebihi ukuran maksimum dari daftar argumen perintah. Kamu bisa memakaixargs --show-limits info khusus sistem untuk ini.
Ukuran maksimum dari daftar argumen juga diperhitungkan oleh xargs, yang membatasi jumlah argumen yang diteruskan ke setiap pemanggilan python sesuai dengan batas itu. Karena xargsmasih harus memanggil python beberapa kali, saran akira untuk menggunakan os.path.walkuntuk mendapatkan daftar file mungkin akan menghemat waktu Anda.
seduntuk setiap file. Saya tidak yakin apakah ada cara untuk membuka, mengedit, menyimpan, dan menutup serangkaian file dised; jika kecepatan sangat penting Anda mungkin ingin menggunakan program yang berbeda, mungkin perl atau python.