我怎样才能让 bash 不匹配 `.` 和 `..` 与 `.*`

ico*_*ast 6 bash wildcards dot-files

当我尝试将目录中的所有点文件与其匹配时,.*它似乎有一个令人讨厌的副作用:除了匹配所有(真实)文件和目录之外,它还匹配....

bash-3.2$ mv test/.* dest/
mv: rename test/. to dest/.: Invalid argument
mv: test/.. and dest/.. are identical
Run Code Online (Sandbox Code Playgroud)

这看起来真的很奇怪,因为它们基本上是“假”目录,只是为了简化相对路径。它们不是目录内容的一部分,当我尝试将一个目录的内容移动到另一个目录时,我不希望它们匹配。我想不出任何我希望它们与.*.

那么我该如何关闭它呢?(除了使用 Z shell,它并不总是可用,并且可能不是运行我编写的函数的人使用的 shell。)

enz*_*tib 9

您可以使用GLOBIGNOREbash 变量。

       环球网
              定义文件名集的以冒号分隔的模式列表
              被路径名扩展忽略。如果文件名与
              路径名扩展模式也匹配以下模式之一
              GLOBIGNORE,它从匹配列表中删除。

       …………………… 文件名 ``.'' 和 ``..'' 总是
       设置 GLOBIGNORE 且不为空时忽略。  

所以如果你设置

GLOBIGNORE='*/.:*/..'
Run Code Online (Sandbox Code Playgroud)

thenpath/.*将不匹配.and ..,如您所问。

  • `GLOBIGNORE=.:...` 不会更简洁地完成同样的事情吗?还是我遗漏了细微的差别? (2认同)