리눅스 파일 검색에 대해 읽는 동안 나는 다음을 얻었습니다 …
* 와일드 카드를 사용하여 파일을 검색하려면 알 수없는 문자열을 *로 바꾸십시오. 예를 들어 확장자가 .out 인 것을 기억하는 경우 ls * .out을 입력하십시오.
그리고 시스템에서 다음 명령을 시도했을 때 (ubuntu 14.04 LTS) ..
anupam@JAZZ:~$ ls *.bash*
ls: cannot access *.bash* : No such file or directory
anupam@JAZZ:~$ ls .bash*
.bash_history .bash_logout .bash_profile .bashrc
anupam@JAZZ:~$
첫 번째 경우에는 그러한 디렉토리가 표시되지 않는 이유 ( *.bash*
) 및 다음 경우에는 파일을 표시하는 경우 ( .bash*
)
나는이 맛에 익숙하지 않으며, 나의 automata 이론 클래스 (*)에 따르면 엡실론 (빈)을 포함한 문자열의 조합을 의미하므로 결과가 두 경우 모두 다른 이유는 무엇입니까?
답변
당신이 할 때 ls *
(가) *
확장되고 전에 이 전달됩니다 ls
. 즉 , 디렉토리 에 실제로 3 개의 파일 ( a
, b
및 c
)이있는 경우를 말합니다 .ls *
ls a b c
Bash가 확장 할 수 없으면 원시 문자열 ¹을 통과합니다. 따라서 찾을 수없는 메시지와 함께 오류에 와일드 카드가 표시됩니다. ls
문자 그대로라는 파일의 목록을 표시하려고했습니다 *.bash*
.
그래서 왜 그 확장하지 않았다? 기본적으로 글 로빙 (이 와일드 카드 확장이라고 함)은 숨겨진 파일을 반환하지 않습니다. 다음과 같이 변경할 수 있습니다 (이것이 shopt -s dotglob
붙어 있지 않으면 지속되지 않습니다 .bashrc
. 좋은 이유로 기본적으로 비활성화되어있을 수 있으므로 조심하십시오). 여기 간단한 데모가 있습니다.
$ ls *.bash*
ls: cannot access *.bash*: No such file or directory
$ shopt -s dotglob
$ ls *.bash*
.bash_aliases .bash_history .bash_logout .bashrc .bashrc.save
이미 명시했듯이 이미 명시 적으로 언급 한 경우 파일과 같은 패턴으로 숨겨집니다 .bash*
. 단순히 기본 dotglob
설정을 무시합니다 .
$ shopt -u dotglob # unset dotglob
$ ls .bash*
.bash_aliases .bash_history .bash_logout .bashrc .bashrc.save
어쨌든 그 기발한 일이 아니라면, 이것이 표면 아래에서 무슨 일이 일어나고 있는지 이해하는 데 도움이되기를 바랍니다.
다른있다 shopt
작품을 글 로빙 방식 변경 플래그 : extglob
, failglob
, globstar
, nocaseglob
와 nullglob
. 그들과 다른 shopt
깃발 의 뗏목은 Bash 매뉴얼의 일부로 문서화되어 있습니다 .
마찬가지로, 패턴 일치 페이지가 잘 읽혀 져야합니다.
¹ failglob
또는 nullglob
설정되어 있지 않은 경우 .