Shell
命令“ls .*”和“ls *”的不同輸出
命令
ls .*
執行時給出以下輸出:
- 目前目錄中所有以 . (隱藏文件)
- 目前目錄中存在的隱藏目錄中的所有文件
- 目前目錄下的所有文件
- 父目錄下的所有文件
為什麼命令
ls *.
不顯示:
- 目前目錄下的所有文件
- 父目錄下的所有文件
我這麼想的原因是:正則表達式 *. 應該匹配兩者。和 .. 所以 ls 應該在兩者上執行,因此應該顯示我期望的輸出
這是因為預設情況下
*
不匹配以 a 開頭的文件。.
考慮以下目錄:$ ls -la total 8404 drwxrwxrwx 2 terdon terdon 8105984 Dec 31 13:14 . drwxr-xr-x 153 terdon terdon 491520 Dec 30 22:32 .. -rw-r--r-- 1 terdon terdon 0 Dec 31 13:14 .dotfile -rw-r--r-- 1 terdon terdon 0 Dec 31 13:14 file1 -rw-r--r-- 1 terdon terdon 0 Dec 31 13:14 file2 -rw-r--r-- 1 terdon terdon 0 Dec 31 13:14 file3.
讓我們看看您使用的每個 glob 擴展為:
$ echo .* . .. .dotfile $ echo *. file3. $ echo * file1 file2 file3.
如您所見,
*
不包括以.
so開頭的文件或目錄,./
因此../
被忽略。ls
你的例子也發生了同樣的事情。在bash
中,您可以使用dotglob
參數更改它,這也將導致*
擴展為點文件(但不是.
或..
,這些仍然被忽略):$ shopt -s dotglob $ echo * .dotfile
其他 shell 的行為不同。例如,在使用時
zsh
也會忽略.
and :..``.*
% echo .* .dotfile