Shell-Script
使用 Python Shebang 查找所有文件
我正在嘗試對大型原始碼樹執行 PEP8 檢查。該樹由各種語言的混合文件組成。這個想法是檢查所有 Python 腳本,而不必明確列出它們。這些文件中的大多數實際上沒有
.py
副檔名。有沒有一種簡單的方法可以在 shebang 中查找所有帶有 Python 一詞的文件,或者查找所有在執行時將使用 Python 執行的文件?
嘗試這樣做:
grep -rl '^#!/.*python' .
與ack相同:
ack -rl '^#!/.*python' .
使用 GNU、FreeBSD、NetBSD 或 OpenBSD(可能還有其他)
awk
:find . -type f -exec awk ' /^#!.*python/{print FILENAME} {nextfile}' {} +
只會查看每個文件的第一行,並且會
awk
根據需要執行盡可能少的 s。上面的
nextfile
陳述不是標準的,但在一些實現中可以找到,包括 GNU (這可能是它的起源)。雖然上面的程式碼似乎也可以在其他實現中工作,但該
nextfile
語句不會在那裡做任何事情(將被辨識為包含未設置nextfile
變數的表達式),因此這意味著所有文件都將被完全讀取並且文件名將為每個匹配的行列印。如果您的
awk
支持FNR
(如 POSIX awks 支持但不是原來的awk
,所以在 Solaris 上/usr/xpg4/bin/awk
而不是/usr/bin/awk
)而不支持nextfile
,您可以編寫它:find . -type f -exec awk 'FNR == 1 && /^#!.*python/{print FILENAME}' {} +
它仍然會盡可能少地執行,
awk
但會完全讀取文件。另一種避免完全讀取文件並且適用於每個文件的替代方法,
awk
但find
意味著awk
每個文件執行一個文件是:find . -type f -exec awk ' /^#!.*python/{r=1};{exit} END {exit(1-r)}' {} \; -print