如何使 bash 不將“.”和“..”與“.*”匹配

如何使 bash 不將“.”和“..”與“.*”匹配

當我嘗試匹配目錄中的所有點文件時,.*它似乎有一個令人討厭的副作用:除了匹配所有(真實)文件和目錄之外,它還匹配...

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

您可以使用GLOBIGNOREbash 變數。

       格洛比諾
              定義檔案名稱集的以冒號分隔的模式列表
              被路徑名擴展忽略。如果檔案名稱與
              路徑名擴展模式也符合以下模式之一
              GLOBIGNORE,它已從匹配列表中刪除。

       ....................-.檔案名稱“.”和“..”始終
       當 GLOBIGNORE 設定且不為空時被忽略。  

所以如果你設定

GLOBIGNORE='*/.:*/..'

正如您所要求的,然後path/.*將不匹配...

答案2

全域模式是.[^.]*-它符合至少有 2 個字元的內容,其中第二個字元不是點。

檔案名稱模式相符的文件位於 bash 手冊頁或此處:http://www.gnu.org/software/bash/manual/bash.html#Pattern-Matching


喬納森·卡倫提出了一個很好的觀點。您可以使用相當簡單的擴充模式

shopt -s extglob
ls -d .!(.|)

相關內容