Linux

ls -ad */ 不會顯示隱藏目錄

  • August 7, 2021

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 中,您可以使用nullglobor failglobshell 選項。nullglob 導致它被擴展為空(即從參數列表中刪除),而 failglob 觸發錯誤。

當您執行 時ls -a,命令行上沒有文件名ls(如 所示ls),因此它決定了它應該自己列出的文件名。由於-a已指定,包括顯示“隱藏”文件。

當您執行ls -d */andls -ad */時,shell 會展開*/,並提供ls將顯示的文件名列表。*在文件名模式的開頭不匹配.,因此*/不包含隱藏文件:與 結合使用-d, 在-a這裡沒有效果。

要查看隱藏目錄,您可以明確列出它們:ls -d -- */ .*/. 在某些 shell 中,您也可以要求*匹配隱藏文件;例如在 Bash 中, with shopt -s dotglob(注意...不包括在這種情況下,這使得它的行為更像ls -A)。

另請注意--,您忘記標記選項的結尾以確保文件名不被視為選項,如果它們以-. 另請注意,*/包括目錄和目錄的符號連結。如果使用zsh,您可以ls -d -- *(D/)只列出目錄(包括帶有 的隱藏目錄D),而不/在每個文件中添加尾隨。或者*(D-/),如果您確實想要目錄的符號連結。

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