本案環境:
[root@bright public]# cat /etc/redhat-release && uname -r CentOS release 6.6 (Final) 2.6.32-504.el6.x86_64
使用find 命令時報錯:
[root@bright public]# find /opt -type f -name fil* -exce ls -lh {} \; find: 路徑必須在表達式之前: file4.txt [root@bright public]# find / -name *.txt find: 路徑必須在表達式之前: file78.txt
解決的方法有兩種
使用轉義符把*轉義,即 \*.txt
用引號引起來 ,即 "*.txt"
原因:
首先,shell 會擴展*.txt 如果有匹配,根據匹配的數量會有不同的結果。
0 個匹配: *.txt 仍然保持不變
1 個匹配: *.txt 變成那個匹配的文件名
多於 1 個匹配: *.txt 變成多個單詞,也就是所有匹配的文件名
例如:/tmp下有1.txt 2.txt就會報錯,因爲find命令成爲了
find /tmp/ -name 1.txt 2.txt -exec ls -l {} \;
只有1.txt會被識別,2.txt無法識別所以會報錯。如果要在 -name 中使用正則表達式,必須加以轉義,防止 shell 首先擴展它。轉義的辦法就是加上\或者引號,這樣 -name 選項總是隻接受這一個參數。
不過在我機器上不轉義也不會報錯,我覺得各個linux版本之間可能還是會有差異,這個沒有對與錯,但是需要有一個標準,寫命令的時候要按照標準來寫,也就是都加上轉義,以免寫腳本的時候其他機器報錯。