Python Shebang ile tüm dosyaları bul


9

Büyük bir kaynak ağaca karşı PEP8 kontrolü yapmaya çalışıyorum. Ağaç, çeşitli dillerde bir dosya karışımından oluşur. Fikir, tüm Python komut dosyalarını açıkça listelemek zorunda kalmadan kontrol etmektir. Bu dosyaların çoğunun aslında bir .pyuzantısı yoktur. Mesele Python kelimesi ile tüm dosyaları bulmak veya yürütüldüğünde Python ile çalıştırılacak tüm dosyaları bulmak için basit bir yolu var mı?

Yanıtlar:


7

Bunu yapmayı deneyin:

grep -rl '^#!/.*python' .

Ack ile aynı şey :

ack -rl '^#!/.*python' .

5
grep -lBir eşleşme bulur bulmaz bir dosyayı okumayı bırakırken , eşleşmeyen dosyalar için dosyanın tamamını okuyacağını unutmayın. Ayrıca dosyaların ortasında eşleşmeler bulur, bu nedenle örneğin sharpython komut dosyaları içeren bir dosyada eşleşebilir .
Stéphane Chazelas

14

GNU veya FreeBSD veya NetBSD veya OpenBSD (ve muhtemelen diğerleri) ile awk:

find . -type f -exec awk '
  /^#!.*python/{print FILENAME}
  {nextfile}' {} +

Her dosyanın yalnızca ilk satırına bakar ve gerektiği kadar az sayıda çalışır awk.

Yukarıdaki nextfileifade standart değildir ancak GNU olanı da içeren birkaç uygulamada bulunur (muhtemelen kaynaklandığı yer).

Yukarıdaki kod diğer uygulamalarda da çalışıyor gibi görünse de, nextfileifade orada hiçbir şey yapmaz (ayarlanmamış bir nextfiledeğişkenden oluşan bir ifade olarak kabul edilir ), böylece tüm dosyalar tam olarak okunacak ve dosya adı her eşleşen satır için yazdırılacaktır.

Senin Eğer awkdestekleri FNR(POSIX awks gibi değil orijinal ama yapacak awk, böylece Solaris üzerinde /usr/xpg4/bin/awkdeğil /usr/bin/awkdeğil) nextfile, bunu yazabiliriz:

find . -type f -exec awk 'FNR == 1 && /^#!.*python/{print FILENAME}' {} +

Bu da yine awkde mümkün olduğunca az sayıda çalışır ancak dosyaları tam olarak okurdu.

Dosyaları tam olarak okumaktan kaçınmak için başka bir alternatif ve her biri ile çalışacak awkve dosya başına findbir tane çalıştırmak anlamına awkgelecektir:

find . -type f -exec awk '
  /^#!.*python/{r=1};{exit}
  END {exit(1-r)}' {} \; -print

1
+1, ancak son komut boş dosyalarla da eşleşir.
l0b0

İyi nokta @ l0b0. Güncellenmiş.
Stéphane Chazelas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.