매개변수와 일치하는 값을 큰따옴표로 표시해야 하는 -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")
아마도 내가 질문을 오해한 것 아닐까요?