萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux find 指令報錯「paths must precede expression」根因與解法:萬用字元未加引號

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

find 指令報錯示意圖

錯誤重現

$ find . -mtime +30 -type f -name *.php
find: paths must precede expression
Usage: find [-H] [-L] [-P] [path...] [expression]

核心成因:Shell 先於 find 展開萬用字元

當前目錄下有 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

標準解法:加引號或跳脫

✅ 寫法 1:單引號(最推薦,防止所有展開)

find . -mtime +30 -type f -name '*.php'

✅ 寫法 2:反斜線跳脫星號

find . -mtime +30 -type f -name \*.php

❌ 寫法 3:雙引號(變數仍會展開,不推薦)

find . -name "*.php"   # 若無變數尚可,但最佳實踐統一用單引號

完整範例:查找 30 天前修改的 .php 檔並輸出絕對路徑

find /var/www/html -type f -name '*.php' -mtime +30 -printf '%p\n'

延伸:多模式匹配(需配合 -o 邏輯或)

# 找 .php 或 .phtml
find . -type f \( -name '*.php' -o -name '*.phtml' \)

結語

鐵律: `find` 的 `-name`、`-path`、`-regex` 參數值,**永遠用單引號包裹**。這不只是解決報錯,更是防止 Shell 展開導致邏輯錯誤的防呆設計。養成習慣,`find` 永遠不會再噴這個錯。

copyright © 萬盛學電腦網 all rights reserved