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 sed
10 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 xargs
akan 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 inplace
pilihan mengatakan itu untuk ajaib "menangkap" output dan menggunakannya untuk mengganti setiap baris.
Perhatikan bahwa replace
metode string Python tidak menggunakan regexps; jika Anda membutuhkannya, Anda harus import re
dan 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 find
perintah 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 xargs
masih harus memanggil python beberapa kali, saran akira untuk menggunakan os.path.walk
untuk mendapatkan daftar file mungkin akan menghemat waktu Anda.
sed
untuk 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.