如何使 bash 不匹配 `.` 和 `..` 与 `.*`

当我尝试将目录站点中的所有点文件与 .* 匹配时,它似乎有一个令人讨厌的方面 - 结果:除了匹配所有(真正的)文件和目录之外,它还匹配 ...

bash-3.2$ mv test/.* dest/
mv: rename test/. to dest/.: Invalid argument
mv: test/.. and dest/.. are identical

这看起来真的很奇怪,因为它们通常是“假”目录,只是为了简化相对路径。 它们不是目录站点内容的组成部分,而且当我尝试将一个目录的内容移动到另一个目录时,我以前也不希望它们匹配。 我想不出任何一种我肯定希望它们与 .* 匹配的场景。

那么我该如何改变呢? (除了使用 Z shell,它不是随时可用的,也可能不是运行我创建的函数的人使用的 shell。)

6
2022-06-07 14:38:45
资源 分享
答案: 2

您可以使用 GLOBIGNORE bash 变量。

       GLOBIGNORE
              A colon-separated list of patterns defining the set of filenames
              to be ignored by pathname expansion.  If a filename matched by a
              pathname  expansion  pattern also matches one of the patterns in
              GLOBIGNORE, it is removed from the list of matches.

       .......................-.  The file names ``.''  and ``..''  are always
       ignored  when GLOBIGNORE is set and not null.  

所以如果你设置

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

那么 path/.* 肯定不会像你问的那样匹配 ...

9
2022-06-07 15:11:33
资源

glob 模式肯定是 .[^.]* - 它匹配至少有 2 个字符的东西,其中第 2 个字符不是点。

文件名模式匹配的文档在bash男网页或以下:http://www.gnu.org/software/bash/manual/bash.html#Pattern-Matching


乔纳森·卡伦筹集了一笔资产。 您可以使用一个相当简单的扩展模式

shopt -s extglob
ls -d .!(.|)
0
2022-06-07 15:07:02
资源