bash glob 的行为不符合预期(将父目录作为参数)

bash glob 的行为不符合预期(将父目录作为参数)

我正在尝试将项目的源代码复制到另一个目录,但我不希望它复制 .git 目录(因为它很大并且对我来说不必要)我尝试使用以下方法:

cp -r ~/source/!(.git) ~/destination

但它将源的父目录(在本例中为 ~/ 主目录)复制到目标。我尝试使用这些命令复制它,它似乎可以正常工作而无需通配符:

user1@user1:~$ mkdir test
user1@user1:~$ mkdir test2
user1@user1:~$ mkdir test/orig
user1@user1:~$ touch test/file1
user1@user1:~$ touch test/orig/file2
user1@user1:~$ ls test
file1  orig
user1@user1:~$ ls test/orig
file2
user1@user1:~$ cp -r test/orig/. test2
user1@user1:~$ ls test2
file2

但是一旦我尝试通过通配符省略子目录,它也会复制父目录:

user1@user1:~$ rm test2/*
user1@user1:~$ ls test2
user1@user1:~$ mkdir test/orig/.sub
user1@user1:~$ cp -r test/orig/!(.sub) test2
cp: will not create hard link 'test2/orig' to directory 'test2/.'
user1@user1:~$ ls test2
file1  file2

打印扩展表达式中的内容显示它实际上被翻译为 3 个术语,其中之一是父目录:

user1@user1:~$ echo test/orig/!(.sub)
test/orig/. test/orig/.. test/orig/file2

这是 bash 中的错误还是我没有正确使用 glob?

答案1

我不知道这是否是预期的行为,但似乎可以通过使用变量GLOBIGNORE来限制这些模式来避免它:

$ echo test/orig/!(.sub)
test/orig/. test/orig/.. test/orig/file2
$ GLOBIGNORE='?(*/)@(.|..)*(/)'; echo test/orig/!(.sub)
test/orig/file2

相关内容