bash가 "." 및 ".."와 ".*"를 일치시키지 않게 만드는 방법

bash가 "." 및 ".."와 ".*"를 일치시키지 않게 만드는 방법

디렉터리의 모든 도트 파일을 일치시키려고 하면 불쾌한 부작용이 있는 것 같습니다. 모든 (실제) 파일과 디렉터리를 일치 .*시키는 것 외에도 . ...

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

이것은 기본적으로 상대 경로를 쉽게 만들기 위한 "가짜" 디렉터리이기 때문에 정말 이상해 보입니다. 이는 디렉토리 내용의 일부가 아니며 한 디렉토리의 내용을 다른 디렉토리로 이동하려고 할 때 일치하는 것을 원하지 않습니다. 나는 그들과 함께하고 싶은 것이 아무것도 생각나지 않습니다 .*.

그럼 어떻게 끄나요? (항상 사용 가능한 것은 아니며 내가 작성한 기능을 실행하는 사람들이 사용하는 셸이 아닐 수도 있는 Z 셸을 사용하는 것 외에도)

답변1

GLOBIGNOREbash 변수를 사용할 수 있습니다 .

       그로비노
              파일 이름 집합을 정의하는 콜론으로 구분된 패턴 목록
              경로 이름 확장으로 인해 무시됩니다. 파일명이 같은 경우
              경로 이름 확장 패턴은 다음 패턴 중 하나와도 일치합니다.
              GLOBIGNORE가 경기 목록에서 삭제되었습니다.

그리고

       ..........................-.파일 이름은 "."과 ".."입니다.
       GLOBIGNORE가 설정되고 비어 있지 않으면 무시됩니다.  

그래서 설정하면

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

요청하신 대로 합계 path/.*가 일치하지 않습니다 ....

답변2

전역 패턴은 .[^.]*두 번째 문자가 점이 아닌 2자 이상의 문자와 일치한다는 것입니다.

파일 이름 패턴 일치에 대한 문서는 bash 매뉴얼 페이지 또는 여기에 있습니다:http://www.gnu.org/software/bash/manual/bash.html#Pattern-Matching


조나단 컬렌(Jonathan Cullen)이 좋은 지적을 했습니다. 매우 간단한 확장 패턴을 사용할 수 있습니다

shopt -s extglob
ls -d .!(.|)

관련 정보