執行 find . -name *.php 卻噴出 find: paths must precede expression?這是 Shell **萬用字元展開** 惹的禍。本文解析核心成因,給出單引號、反斜線兩種標準修法,並附贈最佳實踐模板。

$ find . -mtime +30 -type f -name *.php find: paths must precede expression Usage: find [-H] [-L] [-P] [path...] [expression]
當前目錄下有 a.php、b.php,Shell 會先將 *.php 展開為:
find . -mtime +30 -type f -name a.php b.php
`find` 將 b.php 視為第二個 **path**,而非 -name 的參數,故報「paths must precede expression」。
$ echo *.php a.php b.php $ echo '*.php' *.php $ echo \*.php *.php
find . -mtime +30 -type f -name '*.php'
find . -mtime +30 -type f -name \*.php
find . -name "*.php" # 若無變數尚可,但最佳實踐統一用單引號
find /var/www/html -type f -name '*.php' -mtime +30 -printf '%p\n'
# 找 .php 或 .phtml find . -type f \( -name '*.php' -o -name '*.phtml' \)
鐵律: `find` 的 `-name`、`-path`、`-regex` 參數值,**永遠用單引號包裹**。這不只是解決報錯,更是防止 Shell 展開導致邏輯錯誤的防呆設計。養成習慣,`find` 永遠不會再噴這個錯。