為什麼locate */file*name 可以工作,而locate file*name 不行?

為什麼locate */file*name 可以工作,而locate file*name 不行?

以下內容按預期工作:

$ locate */synse_*_r_unseen_zs.npy 
/mnt/home/dario/temp/synse_resources/language_modelling/repo_test_cadavae_5_r_val/bert/cadavae_5_r_unseen_zs.npy                                                                                                   /mnt/home/dario/temp/synse_resources/language_modelling/repo_test_synse_10_r_val/bert/synse_10_r_unseen_zs.npy 
$ locate synse_*_r_unseen_zs.npy 

然而,這並沒有返回任何內容。

這是怎麼回事?

編輯:調試:

$ echo */synse_*_r_unseen_zs.npy 
*/synse_*_r_unseen_zs.npy
$ echo /synse_*_r_unseen_zs.npy
/synse_*_r_unseen_zs.npy
$ echo synse_*_r_unseen_zs.npy
synse_*_r_unseen_zs.npy

答案1

定位檔案時,包含標準通配符(也稱為通配符模式)的locate 命令正在其本機資料庫中尋找檔案的路徑。/synse_*_r_unseen_zs.npy不是檔案的完整路徑,因此不傳回任何內容(因為Ubuntu 中locate /synse_*_r_unseen_zs.npy的搜尋結果是空集),但是是檔案的完整路徑,因此傳回指令的結果。這些命令中的星號字元被locate 解釋為通配符。星號可以代表任意數量的字元(包括零個,換句話說,零個或多個字元)。locate synse_*_r_unseen_zs.npy*/synse_*_r_unseen_zs.npylocate */synse_*_r_unseen_zs.npy

答案2

正如 @steeldriver 所提到的,預設locate*在搜尋字詞的開頭和結尾附加一個通配符(locate abc實際上也是如此locate *abc*除了當您自己在搜尋字詞中新增通配符時,它不會附加或預先新增額外的*通配符。

因此,雖然$ locate synse_*_r_unseen_zs.npy沒有找到任何內容,因為它沒有*在搜尋字詞前面加上 a,但$ locate *synse_*_r_unseen_zs.npy會找到預期的內容

/mnt/home/dario/temp/synse_resources/language_modelling/repo_test_cadavae_5_r_val/bert/cadavae_5_r_unseen_zs.npy                                                                                                   /mnt/home/dario/temp/synse_resources/language_modelling/repo_test_synse_10_r_val/bert/synse_10_r_unseen_zs.npy 

相關內容