bash glob이 예상대로 작동하지 않습니다(상위 디렉터리를 인수로 사용).

bash glob이 예상대로 작동하지 않습니다(상위 디렉터리를 인수로 사용).

내 프로젝트의 소스 코드를 다른 디렉토리에 복사하려고 하는데 .git 디렉토리를 복사하고 싶지 않습니다(크기가 크고 나에게 필요하지 않기 때문에). 다음을 사용해 보았습니다.

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

그러나 소스의 상위 디렉터리(이 경우 ~/home)를 대상에 복사합니다. 다음 명령을 사용하여 복제를 시도했는데 와일드카드 없이도 작동하는 것 같습니다.

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

관련 정보