파일 개수가 1개를 초과하면 작동하지만 작동하지 않는 이유는 무엇입니까 find . -name "*.jav"
? 그들의 기능은 무엇입니까? 왜 리터럴 문자열로 해석되지 않습니까?find . -name *.jav
.jav
" "
"*.jav"
답변1
와일드카드는 명령이 아닌 셸에 의해 확장됩니다. find
자체 시간에 쉘과 유사한 와일드카드 일치를 수행하는 몇 안 되는 명령 중 하나입니다.
를 실행하면 ls *.jav
먼저 셸이 *.jav
일치하는 파일 목록(예: )으로 확장된 file1.jav
file2.jav
file3.jav
다음 ls
결과 인수 list 와 함께 셸이 호출됩니다 file1.jav
file2.jav
file3.jav
. 그렇기 때문에 파일에 대해 아무것도 모르고 해당 인수가 파일 이름인지 여부에 상관하지 않더라도 echo *.jav
동일한 파일 이름 목록이 표시됩니다.echo
실행할 때 find . -name "*.jav"
:
- 쉘은 명령줄을 구문 분석하여 특수 문자를 식별하고 이를 단어와 구두점으로 분할합니다. 인용된 단어
find
,.
의 목록만 있습니다 . 인용 되었으므로 쉘에 관한 한 이는 일반적인 문자입니다.-name
*.jav
*
*
- 쉘은
find
지정된 인수 목록(.
,-name
, ) 을 사용하여 명령을 실행합니다*.jav
. find
*.jav
현재 디렉터리 아래의 모든 디렉터리에서 패턴과 일치하는 이름을 가진 파일을 찾습니다.
실행했는데 find . -name *.jav
일치하는 파일이 없는 경우 *.jav
:
- 쉘은 명령줄을 구문 분석하여 특수 문자를 식별하고 이를 단어와 구두점으로 분할합니다. 이것은 인용 되지 않은 단어 ,
find
의 목록일 뿐입니다 ..
-name
*.jav
*
- 단어에
*.jav
따옴표가 없는 와일드카드가 포함되어 있기 때문에 쉘은 파일 이름 생성을 수행합니다. 일치하는 파일 이름이 없기 때문에 패턴이 확장되지 않은 상태로 유지됩니다. - 쉘은
find
결과 매개변수 목록(예:.
,-name
, ) 을 사용하여 명령을 실행합니다*.jav
. find
*.jav
현재 디렉터리 아래의 모든 디렉터리에서 패턴과 일치하는 이름을 가진 파일을 찾습니다.
실행하면 find . -name *.jav
현재 디렉터리에 file1.jav
, file2.jav
및 다음이 포함됩니다 file3.jav
.
- 쉘은 명령줄을 구문 분석하여 특수 문자를 식별하고 이를 단어와 구두점으로 분할합니다. 이것은 인용 되지 않은 단어 ,
find
의 목록일 뿐입니다 ..
-name
*.jav
*
- 단어
*.jav
에 따옴표가 없는 와일드카드가 포함되어 있기 때문에 쉘은 파일 이름 생성을 수행합니다.*.jav
즉, 일치하는 파일 이름 목록으로 대체됩니다. - 쉘은
find
결과 인수 목록(예:.
,-name
,file1.jav
,file2.jav
, ) 을 사용하여 명령을 실행합니다file3.jav
. find
도착 시 구문 오류에 대해 불평합니다file2.jav
.
실행하면 find . -name *.jav
현재 디렉터리에 일치하는 단일 파일이 포함됩니다 file.jav
.
- 쉘은 명령줄을 구문 분석하여 특수 문자를 식별하고 이를 단어와 구두점으로 분할합니다. 이것은 인용 되지 않은 단어 ,
find
의 목록일 뿐입니다 ..
-name
*.jav
*
- 단어
*.jav
에 따옴표가 없는 와일드카드가 포함되어 있기 때문에 쉘은 파일 이름 생성을 수행합니다.*.jav
즉, 일치하는 파일 이름 목록으로 대체됩니다. - 쉘은
find
결과 매개변수 목록(예:.
,-name
, ) 을 사용하여 명령을 실행합니다file.jav
. find
완벽하게 유효한 명령이 표시되지만 원하는 것은 아닐 수도 있습니다. 일치하는 파일을 찾는 대신 모든 디렉터리에서 호출된 파일을find
찾으라는 메시지가 표시됩니다 .file.jav
*.jav
(쉘 평가 및 확장에는 다른 많은 기능이 있습니다. 여기서는 관련된 기능만 언급했습니다.)
(가장 일반적인 쉘(sh, bash, dash, ksh 등)의 기본 동작을 설명합니다. 일부 쉘은 확장되지 않은 와일드카드로 명령을 실행하는 대신 오류를 표시하거나 일치하지 않는 와일드카드를 null로 확장하도록 구성할 수 있습니다. 도움이 됩니다.)