find : 路徑必須在表達式之前

本案環境:

[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版本之間可能還是會有差異,這個沒有對與錯,但是需要有一個標準,寫命令的時候要按照標準來寫,也就是都加上轉義,以免寫腳本的時候其他機器報錯。


資料來源

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章