find 명령에서 "작은 따옴표"를 사용하는 것과 "작은 따옴표"를 사용하지 않는 것의 차이점은 무엇입니까?

find 명령에서 "작은 따옴표"를 사용하는 것과 "작은 따옴표"를 사용하지 않는 것의 차이점은 무엇입니까?
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

다른 답변을 보완하기 위해 , zshfish문제 (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) 여기서 불평하는 것은 tcshwhile의 오류가 오해의 소지가 있다는 것입니다. (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.

현재 디렉터리에 확장명이 있는 텍스트 파일이 여러 개 있으면 .txtfind 에서 인수를 볼 수 없기 때문에 다음 작업이 실패합니다 *.txt.

find . -name *.txt

그리고 이것은 성공할 것입니다:

find . -name '*.txt'

관련 정보