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