通配符“*”無法匹配某些字串?

通配符“*”無法匹配某些字串?
ls  -al  .functions*
-rw-r--r-- 1 root root 471040 Mar  2 10:01 .functions.php.swo
-rw-r--r-- 1 root root 438272 Mar  2 09:57 .functions.php.swp

*可以匹配.php.swo.php.swp
為什麼*不能匹配.functions.php

ls  -al  *.swo
ls: cannot access '*.swo': No such file or directory
ls  -al  *swo
ls: cannot access '*swo': No such file or directory

答案1

預設情況下,以點開頭的檔案在檔案清單中隱藏。匹配此類文件的最簡單方法是在表達式的開頭加一個點。但是,這只會匹配以..

ls  -al  .*.swo

dotglob另一種方法是在運行命令之前設置,然後.將包含以 開頭的檔案。

shopt -s dotglob

將其新增至您的~/.bashrc以預設設定。

注意設定dotglob可能會導致意想不到的結果當使用 bash shell 時,因為使用 . 時都會出現.(目前目錄)和..(父目錄)*。有了dotglob套裝,絕不嘗試使用rm -R *.

答案2

作為一個擴大對於 Shaido 的回答,我想解釋為什麼該-a選項在這裡不起作用:

ls命令確實不是處理通配符。命令列解釋器執行此步驟:

如果您鍵入命令列“ ”,命令列解釋器將首先用匹配文件列表mycommand *.c替換通配符字串“ ”,然後執行生成的命令行:*.c

mycommand a.c file.c test.c

命令列解釋器對所有命令都以相同的方式工作,因此它無法知道-a在命令的情況下這意味著“包括隱藏文件” ls(而-a對其他命令具有完全不同的含義)...

相關內容