grep이 대시가 있는 파일 이름과 혼동됨

grep이 대시가 있는 파일 이름과 혼동됨

디렉토리에 대시로 시작하는 파일이 포함되어 있으면 grep이 혼동되는 문제가 발생합니다.

예를 들어 " "라는 파일이 있습니다 ------.js. 비슷한 작업을 수행하면 grep somestring *오류가 발생합니다.

grep: unrecognized option '------.js'
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.

인터넷에 이런 질문이 많이 올라오는 것 같은데, 검색해도 안나오네요.

비슷한 접근 방식을 사용하여 문제를 수동으로 해결할 수 있지만
find . | while read f; do grep MYSTRING "$f"; done
더 간단하고 강력한 솔루션이 있는지 알고 싶습니다.

저는 아치 리눅스를 사용하고 있습니다.

답변1

Romeo의 답변을 보완하여 다음 사항에 유의하십시오.

grep pattern --whatever

POSIX를 찾아야 합니다.무늬--whatever파일 에서 . 옵션이 아닌 인수(여기 pattern) 뒤에는 옵션이 인식되어서는 안 되기 때문입니다 .

이 경우 GNU는 grepPOSIX와 호환되지 않습니다. POSIXLY_CORRECT 환경 변수(어떤 값이든)를 해당 환경에 전달하여 호환 가능하게 만들 수 있습니다.

getopt()getopt_long()이는 명령줄 인수를 구문 분석하기 위해 GNU 또는 /의 호환 가능한 구현을 사용하는 대부분의 GNU 유틸리티 및 유틸리티의 경우입니다.

.envenv VAR=x grep --versiongrepenv​또 다른 주목할만한 예외는 GNU 쉘( bash)인데, 인터프리터와 그 내장 함수 중 어느 것도 옵션이 아닌 인수 뒤에 옵션을 허용하지 않습니다. 심지어 getoptsGNU 방식으로 옵션을 구문 분석할 수도 없습니다.

어쨌든 이렇게 하면 POSIXLY_CORRECT가 저장되지 않습니다.

grep -e pattern *.js

( pattern여기에는 옵션이 아닌 인수가 없으며 -e옵션에 인수로 전달되므로 나중에 더 많은 옵션이 허용됩니다.)

-+따라서 다음 내용이 특정 도구(또는 일부 도구)로 시작 되지 않을 것이라고 보장할 수 없는 경우 항상 옵션의 끝을 --로 표시하는 것이 좋습니다.

grep -e pattern -- *.js
grep -- pattern *.js

또는 다음을 사용하십시오:

grep -e pattern ./*.js

( 이것은 grep -- pattern *while이라는 파일이 있는 경우 -도움이 되지 않습니다 . 파일 자체가 로 시작할 수 있는 경우 에는 grep pattern ./*대신 while을 사용해야 합니다 .)grep -e "$pattern"grep "$pattern"$pattern-

1990년대 중반에는 환경 변수 를 통해 옵션으로 간주되지 않아야 하는 매개변수(일반적으로 glob 확장에 의해 생성된 매개변수 )를 bash구별하려는 시도가 있었지만 이 시도는 해결하는 문제보다 더 많은 문제를 야기했기 때문에 제거되었습니다.getopt()_<pid>_GNU_nonoption_argv_flags_

답변2

"매개변수 끝"을 알려주는 grep 옵션을 사용해 볼 수 있습니다.

grep -- <string> <filename>

그러면 grep이 다음 대시를 인수로 무시하고 이를 명령줄의 다음 요소로 처리하도록 지시합니다.

답변3

다른 답변과 함께 TLDR을 게시하려면확실히고정시키다,

grep -e pattern ./*.js

이는 --해당 옵션이 없는 명령에 대해 작동합니다. 상당히 광범위하게 지원되지만 모든 명령이 이를 처리할 수 있는 것은 아닙니다.

(또한 -e모호함도 명확하다는 점에 유의하십시오.무늬대시로 시작하세요. 물론 이 문제를 해결하기 위해 비슷한 접근 방식을 사용할 수 있지만 [-]pattern그것은 작동하지 않습니다 grep -F. 스키마가 사용자가 제공하는 경우에는 문제를 일으키지 않는 것이 가장 좋습니다. )

"(거의) 항상 변수를 인용"한 다음 이것은 아마도 쉘 프로그래밍에서 두 번째로 가장 일반적인 문제일 것입니다. 와일드카드 일치 및 사용자 제공 데이터에는 선행 대시가 포함될 수 있으며 때때로 포함되므로 준비하는 것이 좋습니다.

답변4

find . -name '-*' -exec rename 's/[- ]//' {} \;

관련 정보