
當我嘗試匹配目錄中的所有點文件時,.*
它似乎有一個令人討厭的副作用:除了匹配所有(真實)文件和目錄之外,它還匹配.
和..
。
bash-3.2$ mv test/.* dest/
mv: rename test/. to dest/.: Invalid argument
mv: test/.. and dest/.. are identical
這看起來真的很奇怪,因為它們基本上是“假”目錄,只是為了使相對路徑變得容易。它們不是目錄內容的一部分,當我嘗試將一個目錄的內容移到另一個目錄時,我不希望它們匹配。我想不出任何我希望它們與.*
.
那麼我該如何關閉它呢? (除了使用 Z shell 之外,Z shell 並不總是可用,而且可能不是運行我編寫的函數的人使用的 shell。)
答案1
您可以使用GLOBIGNORE
bash 變數。
格洛比諾 定義檔案名稱集的以冒號分隔的模式列表 被路徑名擴展忽略。如果檔案名稱與 路徑名擴展模式也符合以下模式之一 GLOBIGNORE,它已從匹配列表中刪除。
和
....................-.檔案名稱“.”和“..”始終 當 GLOBIGNORE 設定且不為空時被忽略。
所以如果你設定
GLOBIGNORE='*/.:*/..'
正如您所要求的,然後path/.*
將不匹配.
和..
。
答案2
全域模式是.[^.]*
-它符合至少有 2 個字元的內容,其中第二個字元不是點。
檔案名稱模式相符的文件位於 bash 手冊頁或此處:http://www.gnu.org/software/bash/manual/bash.html#Pattern-Matching
喬納森·卡倫提出了一個很好的觀點。您可以使用相當簡單的擴充模式
shopt -s extglob
ls -d .!(.|)