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