Bash

如何將 * 與目錄中的隱藏文件匹配

  • February 1, 2019

如何匹配給定目錄中的隱藏文件

例如

如果我給出以下命令,它不會給出隱藏文件的結果,

du -b maybehere*/*

如何使用單個命令而不是使用

du -b maybehere*/.* maybehere*/*

因為我需要在這裡輸入兩次。

利用大括號擴展:

du -b maybehere*/{*,.[^.],.??*}

或者

du -b maybehere*/{,.[^.],..?}*

這背後的邏輯可能並不明顯,所以這裡解釋一下:

  • *匹配所有非隱藏文件
  • .[^.]匹配名稱以單點開頭後跟非點的文件;在第一種形式中只有 2 個字元的文件名。
  • .??*匹配至少 3 個字元長的隱藏文件
  • ..?*像上面一樣,但第二個字元必須是一個點

關鍵是要排除指向目前目錄和父目錄(...)的硬連結,但要包括所有普通文件,以使每個文件只計算一次!

例如,最簡單的就是寫

du -b maybehere*/{.,}*

這意味著該列表包含一個點.和“nothing”(nothing is between ,and closing }),因此所有隱藏文件(從點開始)和所有非隱藏文件(從“nothing”開始)將匹配。問題是這也會匹配.and ..,這很可能不是你想要的,所以我們必須以某種方式排除它。


關於大括號擴展的最後一句話。

大括號擴展是一種機制,您可以通過它通過編寫更少的字元將更多文件/字元串/任何內容包含到命令行中。語法是{word1,word2,...},即它是一個逗號分隔的字元串列表,以 . 開頭{和結尾}bash手冊給出了一個非常基本但同時又非常常見的用法範例:

$ echo a{b,c,d}e
abe ace ade

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