Bash가 `.` 및 `..`를 `.*`와 일치하지 않게 하려면 어떻게 해야 합니까?

Bash가 `.` 및 `..`를 `.*`와 일치하지 않게 하려면 어떻게 해야 합니까?

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

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

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

그럼 어떻게 해야 끌 수 있나요? (항상 사용 가능한 것은 아니며 내가 작성한 함수를 실행하는 누군가가 사용하는 셸이 아닐 수도 있는 Z 셸을 사용하는 것 외에)

답변1

bash 변수를 사용할 수 있습니다 GLOBIGNORE.

       글로비뇨어
              파일 이름 세트를 정의하는 콜론으로 구분된 패턴 목록
              경로 이름 확장에서는 무시됩니다. 파일 이름이 다음과 일치하는 경우
              경로 이름 확장 패턴도 다음의 패턴 중 하나와 일치합니다.
              GLOBIGNORE, 일치 목록에서 제거됩니다.

그리고

       ..........................-. 파일 이름 ``.'' 및 ``..''는 항상
       GLOBIGNORE가 설정되면 무시되며 null이 아닙니다.  

그래서 설정하면

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

그러면 요청한 대로 및 path/.*일치하지 않습니다 ....

답변2

glob 패턴은 다음과 같습니다 .[^.]*. 두 번째 문자가 점이 아닌 2자 이상의 문자와 일치합니다.

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


조나단 캘런(Jonathan Callen)이 좋은 지적을 했습니다. 상당히 간단한 확장 패턴을 사용할 수 있습니다

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

관련 정보