如何使 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 .!(.|)

相关内容