ls .*가 ls ./.*와 다른 파일을 표시하는 이유는 무엇입니까?

ls .*가 ls ./.*와 다른 파일을 표시하는 이유는 무엇입니까?

현재 디렉터리에 빈 파일 .ignoramus가 있습니다.

bojan@localhost:~$ echo $GLOBIGNORE
.ignoramus
bojan@localhost:~$ ls .* | grep ignor
bojan@localhost:~$ ls ./.* | grep ignor
./.ignoramus

사용된 도구 ls(GNU coreutils) 8.23 ​​​​GNU bash, 버전 4.3.42(1)-릴리스(x86_64-pc-linux-gnu)

답변1

이 설정은 명령줄에서 와일드카드 문자를 확장할 때 $GLOBIGNORE쉘에 의해 처리됩니다 . 첫 번째 경우, 쉘은 먼저 .*로 확장됩니다 .ignoramus. 이는 일치하므로 $GLOBIGNORE에 전달된 이름에 포함되지 않습니다 ls.

두 번째 경우에는 쉘이 다음 ./.*으로 확장됩니다../.ignoramus아니요$GLOBIGNORE로 설정하면 $GLOBIGNORE.ignoramus:./.ignoramus번째 명령의 동작이 첫 번째 명령과 일치합니다 .

답변2

간단한 이유: 문자열 ./.ignoramus불일치 .ignoramus.

간단한 해결책: 사용 GLOBIGNORE=*ignoramus(마지막 세부정보 참조).

$ GLOBIGNORE=*ignoramus
$ ls .* | grep ignor                 ### empty
$ ls ./.* | grep ignor               ### also empty

/별표는 무엇이든 일치합니다(이름 앞의 슬래시도 포함).
물론 이것도 일치합니다 foobar.ignoramus. 몇 가지 해결 방법은 끝부분을 참조하세요.


자세한 답변:

이는 일반 파일에서도 발생합니다.

$ mkdir /tmp/mytest; cd /tmp/mytest
$ touch f1 f2 filetotest
$ GLOBIGNORE=filetotest
$ ls -1
f1
f2
filetotest

$ ls -1 f*
f1
f2

$ ls -1 *
f1
f2

$ ls -1 ./f*
./f1
./f2
./filetotest

GLOBIGNORE는 일치하지 않지만 ./filetotest다음을 사용하는 경우:

$ GLOBIGNORE="*filetotest"
$ ls -1 ./f*
./f1
./f2

$ ls -1 ./*
./f1
./f2

$ ls -1
f1
f2
filetotest

GLOBIGNORE의 패턴은 (something)filetotest.

귀하의 예를 들어:

$ touch .ignoramus
$ GLOBIGNORE='*ignoramus'
ls -1a
.
..
f1
f2
filetotest
.ignoramus

$ ls .* | grep ignor
$ ls ./.* | grep ignor

파일 앞에 일부 경로가 있는 경우에도 작동합니다.

$ GLOBIGNORE='*ignoramus:*filetotest'
$ mkdir -p long/dir/to/test
$ touch long/dir/to/test/{f3,f4,.ignoramus,.other,filetotest}

$ ls -1 long/dir/to/test/f*
long/dir/to/test/f3
long/dir/to/test/f4

$ ls -1 long/dir/to/test/.[^.]*
long/dir/to/test/.other

$ shopt -s dotglob
$ ls -1 long/dir/to/test/*
long/dir/to/test/f3
long/dir/to/test/f4
long/dir/to/test/.other

$ unset GLOBIGNORE; shopt -s dotglob
$ ls -1 long/dir/to/test/*
long/dir/to/test/f3
long/dir/to/test/f4
long/dir/to/test/filetotest
long/dir/to/test/.ignoramus
long/dir/to/test/.other

물론 이것도 일치합니다 bar.ignoramus. 필요하지 않은 경우 다음을 사용하십시오.

$ GLOBIGNORE=.ignoramus:./.ignoramus

또는 임의의 경로를 포함하려는 경우:

$ GLOBIGNORE=.ignoramus:*/.ignoramus

관련 정보