문자열을 재귀적으로 검색하려고 하는데 grep
다음과 같은 결과가 나타납니다.
$ grep -r "stuff" *
grep: unrecognized option '---corporate-discount.csv'
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.
-
Bash가 매개변수로 시작하는 파일을 전달하는 것을 방지하는 방법은 무엇입니까 ?
답변1
먼저, 대시로 시작하는 매개변수의 해석은 실행 중인 프로그램 grep
이나 다른 프로그램에 따라 달라집니다. 쉘에는 이를 제어할 수 있는 직접적인 방법이 없습니다.
대부분의 프로그램과 마찬가지로 이러한 파일을 (완전히 무시하지 않고) 처리하려고 한다고 가정하면 이는 옵션의 끝을 나타내는 것으로 grep
인식됩니다 .--
grep -r -e "stuff" -- *
당신이 원하는 것을 할 것입니다. 거기의 경우 -e
도 stuff
a로 시작합니다.-
또는 다음을 사용할 수 있습니다.
grep -r -e "stuff" ./*
-
후자는 또한 호출되는 현재 디렉터리에 파일이 있는 경우 문제를 방지합니다. --
구분자 뒤에도 stdin으로 grep
해석되는데 , -
현재 디렉토리에서 ./-
호출되는 파일이다 .-
답변2
도착하다Bash 확장이 "-"로 시작하는 파일을 전달하지 못하도록 방지당신은 그것을 사용할 수 있습니다 :
echo [!-]*
대부분의 쉘에서 이식 가능하거나 ksh, bash, zsh에만 적용됩니다.
echo !(-*)
예: 이 파일이 포함된 디렉터리
$ echo *
a b c ---corporate-discount.csv d -e --option.txt
목록만( extglob
활성인 경우):
$ shopt -s extglob
$ echo !(-*)
a b c d
$ echo [!-]*
a b c d
-
그러나 옵션으로 a로 선언된 파일을 해석하지 않도록 grep에 지시하면서 모든 파일을 처리하려면 다음을 추가하면 됩니다 ./
.
grep -r "stuff" ./*
또는 -
나열된 파일 중에서 보장된 호출된 파일이 없는 경우(grep은 단독 파일을 다음 -
과 같이 해석합니다.표준 입력에서 읽기) 다음과 같이 사용할 수 있습니다.
grep -r -- "stuff" *