find ~/ -name *test.txt
find ~/ -name '*test.txt'
첫 번째 양식은 실패하지만 두 번째 양식은 여전히 작동하는 예제를 작성해야 합니다.
답변1
따옴표는 쉘 와일드카드 확장으로부터 콘텐츠를 보호합니다. 해당 명령을 실행하면(또는 더 간단하게 파일이 echo *test.txt
있는 디렉터리 footest.txt
에서 실행 한 다음 끝에 파일이 없는 디렉터리에서 실행 test.txt
하면) 차이점을 확인할 수 있습니다.
$ ls
a b c d e
$ echo *test.txt
*test.txt
$ touch footest.txt
$ echo *test.txt
footest.txt
찾기에서도 같은 일이 발생합니다.
$ set -x
$ find . -name *test.txt
+ find . -name footest.txt
./footest.txt
$ find . -name '*test.txt'
+ find . -name '*test.txt'
./footest.txt
$ touch bartest.txt
+ touch bartest.txt
$ find . -name *test.txt
+ find . -name bartest.txt footest.txt
find: paths must precede expression
Usage: find [-H] [-L] [-P] [path...] [expression]
$ find . -name '*test.txt'
+ find . -name '*test.txt'
./bartest.txt
./footest.txt
답변2
TL;박사 버전
큰따옴표처럼 문자열 리터럴을 명령/프로그램에 전달하지만 작은따옴표를 사용하면 변수와 와일드카드가 확장되지 않는 반면 큰따옴표는 문자열 리터럴로 확장된다는 차이점이 있습니다.
예:
$ export MY_VAR=my_string
$ echo "$MY_VAR"
my_string
$ echo '$MY_VAR'
$MY_VAR
와일드카드에도 동일하게 적용됩니다.
편집하다:
두 번째 명령과 일치하는 리터럴은 필연적으로 첫 번째 명령의 와일드카드와 일치하기 때문에 귀하가 요청한 것과 같은 예는 불가능해 보입니다.
답변3
다른 답변을 보완하기 위해 , zsh
및 fish
문제 (t)csh
가 발생하기 전에 오류를 표시하는 데 도움이 될 수 있으므로 여기에서 더 유용합니다.
*test.txt
현재 디렉터리에 파일이 없는 경우:
zsh$ find . -name *test.txt
zsh: no matches found: *test.txt
fish> find . -name *test.txt
fish: No matches for wildcard '*test.txt'.
find . -name *test.txt
^
tcsh> find . -name *test.txt
find: No match.
fish
그리고 zsh
이것이 옳다는 것을 분명히 하라.껍데기(아님 find
) 여기서 불평하는 것은 tcsh
while의 오류가 오해의 소지가 있다는 것입니다. (tcsh는 보고만 No match
하지만,모두명령줄의 glob은 일치할 수 없습니다. 일부는 일치하고 일부는 일치하지 않으면 Bourne과 같은 셸에서처럼 일치하지 않는 것이 확장됩니다.
다음을 사용하여 bash
동일한 동작을 얻을 수 있습니다 .
$ shopt -s failglob
$ find . -name *test.txt
bash: no match: *test.txt
답변4
첫 번째 경우 매개변수는 *test.txt
명령 자체의 연산자로 처리되는 find
반면, 따옴표를 사용하면 매개변수는 *test.txt
스위치의 매개변수로 처리됩니다 find
.
현재 디렉터리에 확장명이 있는 텍스트 파일이 여러 개 있으면 .txt
find 에서 인수를 볼 수 없기 때문에 다음 작업이 실패합니다 *.txt
.
find . -name *.txt
그리고 이것은 성공할 것입니다:
find . -name '*.txt'