Shell

命令“ls .*”和“ls *”的不同輸出

  • February 19, 2020

命令

   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

引用自:https://unix.stackexchange.com/questions/107263