매개변수 -name
와 일치하는 값을 find
큰따옴표로 묶어야 하는 이유는 무엇입니까?
# find / -type f -name *.out |wc -l 1>mv.out
0403-027 The parameter list is too long.
# cat mv.out
0
# find / -type f -name "*.out" |wc -l 1>mv.out
# cat mv.out
146302
답변1
큰따옴표가 없으면 쉘이 확장됩니다. 이는 현재 디렉토리에서 일치하는 모든 파일 이름 (주로 점으로 끝나지만 점으로 시작하지 않는 모든 파일) *.out
으로 대체됨을 의미합니다 . 귀하의 경우 인수로 전달된 일치하는 파일이 두 개 이상 있는 것 같습니다 . 이를 어떻게 해야 할지 모르고 인수 목록이 너무 길다고 불평합니다.*.out
.out
find
find
패턴을 인용하면 셸은 그대로 유지되고 따옴표를 제거하면 find
변경되지 않은 매개변수가 표시됩니다 *.out
. 이는 아마도 원하는 것일 것입니다.
답변2
이것이 완전히 맞는지는 잘 모르겠습니다. 그러나 나는 그것을 따옴표로 묶으면 파서가 그것을 정규식으로 읽게 될 것이라고 믿습니다. 따옴표가 없으면 별표는 현재 디렉터리의 모든 파일을 나타냅니다.
다음 사이의 출력 차이를 확인하십시오.
$ echo $(find ./ -name *)
그리고
$ echo $(find ./ -name "*")
따라서 첫 번째 명령을 사용하면 오류가 발생할 수 있습니다. 파일이 있다면부자&술집현재 디렉터리에서 별표는 파일 이름을 나타냅니다. 따라서 명령 구문 분석기는 다음과 같은 명령을 읽습니다.
$ echo $(find ./ -name foo bar)
오류 출력은 입니다 find: bar: unknown primary or operator
.
두 번째 명령은 별표를 모든 파일 이름을 검색한다는 의미의 정규식으로 읽습니다.
편집하다:이제 명령을 더 테스트한 후에는 일부 텍스트가 별표와 결합되어 있는 한 매개변수 값이 따옴표로 묶여 있는지 여부에 관계없이 내 시스템에서 작동하는 것으로 보입니다.
$ echo $(find ./ -name *foo)
동일합니까?
$ echo $(find ./ -name "*foo")
어쩌면 내가 질문을 오해했을까요?