ls -ad */ 不會顯示隱藏目錄
pwd
是我的主目錄。ls */ -d
顯示目錄。~$ ls */ -d Blog/ Desktop/ Documents/ Downloads/ Music/ Pictures/ Public/ Templates/ Videos/
並
ls -a
顯示所有隱藏的目錄和文件。隱藏目錄 -.cache
等.local
。$ ls -a . .cache .gnupg .xsession-errors.old .. .config .gtkrc-2.0 Templates .bash_history Desktop .gtkrc-xfce Pictures .themes .bash_logout .linuxmint .pki Videos .bashrc Documents .local .profile .viminfo Blog Downloads .mozilla Public .Xauthority Music .ssh .xsession-errors
但是當我執行時
ls -ad */
,它不會顯示任何隱藏目錄。有人願意解釋嗎?$ ls -ad */ Blog/ Desktop/ Documents/ Downloads/ Music/ Pictures/ Public/ Templates/ Videos/
*
故意不匹配隱藏文件或目錄,因為大多數時候這正是我們想要的(因為點文件和目錄通常用於配置,而不是數據),您可以通過顯式指定以.
if開頭的 glob 來覆蓋預設值/當你需要的時候。如果您希望它們與 glob 匹配,請使用
ls -d .*
(或ls -d .*/
僅匹配沒有正常文件的隱藏目錄)。要匹配隱藏目錄和非隱藏目錄,請使用ls -d -- */ .*/
注意:正如@rexkogitans 在評論中提到的那樣,glob 在傳遞給程序 之前
*
由shell 擴展。永遠不會看到或(或),它會看到文件和/或目錄名稱的列表,這些名稱是 shell 擴展 glob 的結果。這就是為什麼如果要將 glob 字元作為字元串文字傳遞給程序,則需要引用或轉義(通過以反斜杠作為前綴)的原因。ls``*``.*``.*/
另請注意:如果沒有與 glob 匹配的文件/目錄,則 glob 按原樣傳遞給程序,未擴展(即,
ls
將*
作為其參數)。bash
(以及其他一些類似 bourne 的 shell)允許覆蓋此行為 - 例如,在 bash 中,您可以使用nullglob
orfailglob
shell 選項。nullglob 導致它被擴展為空(即從參數列表中刪除),而 failglob 觸發錯誤。
當您執行 時
ls -a
,命令行上沒有文件名ls
(如 所示ls
),因此它決定了它應該自己列出的文件名。由於-a
已指定,包括顯示“隱藏”文件。當您執行
ls -d */
andls -ad */
時,shell 會展開*/
,並提供ls
將顯示的文件名列表。*
在文件名模式的開頭不匹配.
,因此*/
不包含隱藏文件:與 結合使用-d
, 在-a
這裡沒有效果。要查看隱藏目錄,您可以明確列出它們:
ls -d -- */ .*/
. 在某些 shell 中,您也可以要求*
匹配隱藏文件;例如在 Bash 中, withshopt -s dotglob
(注意.
和..
不包括在這種情況下,這使得它的行為更像ls -A
)。另請注意
--
,您忘記標記選項的結尾以確保文件名不被視為選項,如果它們以-
. 另請注意,*/
包括目錄和目錄的符號連結。如果使用zsh
,您可以ls -d -- *(D/)
只列出目錄(包括帶有 的隱藏目錄D
),而不/
在每個文件中添加尾隨。或者*(D-/)
,如果您確實想要目錄的符號連結。