以下內容按預期工作:
$ 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.npy
locate */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