파일 검색에서 * 사용


9

리눅스 파일 검색에 대해 읽는 동안 나는 다음을 얻었습니다 ...

* 와일드 카드를 사용하여 파일을 검색하려면 알 수없는 문자열을 *로 바꾸십시오. 예를 들어 확장자가 .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 이론 클래스 (*)에 따르면 엡실론 (빈)을 포함한 문자열의 조합을 의미하므로 결과가 두 경우 모두 다른 이유는 무엇입니까?

답변:


11

당신이 할 때 ls *(가) *확장되고 전에 이 전달됩니다 ls. 즉 , 디렉토리 에 실제로 3 개의 파일 ( a, bc)이있는 경우를 말합니다 .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, nocaseglobnullglob. 그들과 다른 shopt깃발 의 뗏목은 Bash 매뉴얼의 일부로 문서화되어 있습니다 .

마찬가지로, 패턴 일치 페이지가 잘 읽혀 져야합니다.

¹ failglob또는 nullglob설정되어 있지 않은 경우 .


고맙습니다 @ 올리, 내가 언급 한대로이 맛을 처음 접했지만 그 80 %를 얻었습니다 ... 도움이되었습니다
나사로
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.