我正在尝试将项目的源代码复制到另一个目录,但我不希望它复制 .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