예를 들어 보겠습니다.
$ echo Hello > file1
$ echo Hello > file2
$ echo Hello > .file3
$ grep Hello * 2>/dev/null
file1:Hello
file2:Hello
.file3
여기에서 grep이 무시되는 것을 볼 수 있습니다..
예상되는 결과:
$ grep Hello * 2>/dev/null
.file3:Hello
file1:Hello
file2:Hello
의 경우 로 시작하는 항목을 무시하지 말라고 하는 ls
매개변수가 있는데 에 대한 기능을 찾을 수 없습니다.-a
.
grep
grep
그렇다면 로 시작하는 항목을 무시하지 않도록 하는 방법이 있습니까 .
? 아니면 왜 grep
무시합니까?
답변1
*
파일 이름 확장자의 선행 마침표와 일치하지 않습니다 .
.이 규칙은 POSIX에 의해 지정됩니다..
패턴 일치를 사용하면 다음과 같이 작동합니다.
$ sh -c 'case . in *) echo 1;; esac'
1
POSIX적으로:
find . ! -name . -prune -type f -exec grep 'pattern' /dev/null {} +
이 접근 방식은 셸 와일드카드를 사용하는 것보다 장점이 있습니다. 너는 결코 얻지 못할 것이다매개변수 목록이 너무 깁니다.파일이 너무 많으면 오류가 발생합니다.
답변2
다른 사람들이 말했듯이, *
glob은 기본적으로 숨겨진 파일(이름이 점으로 시작하는 파일)을 포함하지 않습니다. 이 문제를 해결하는 간단한 방법은 두 개의 글로브를 사용하는 것입니다.
grep Hello * .*
단점은 Forsyth 쉘 zsh
또는 쉘(현재는 OpenBSD 또는 OpenBSD와 같은 파생물)을 기반으로 하는 쉘을 제외하고 디렉토리를 검색할 때 불만이 발생한다는 것입니다.fish
pdksh
mksh
posh
sh
grep
.
..
$ grep Hello * .*
file1:Hello
file2:Hello
grep: .: Is a directory
grep: ..: Is a directory
.file3:Hello
이러한 오류를 무시하거나(이 경우 중요하지 않음) 간단한 루프를 사용하여 대상이 일반 파일인지 확인할 수 있습니다(심볼릭 링크 확인 후).
$ for file in .* *; do [ -f "$file" ] && grep -H -- Hello "$file"; done
.file3:Hello
file1:Hello
file2:Hello
답변3
.
및 다음을 제외하고 숨겨진 파일이 포함된 글로브 의 경우 ..
:
zsh
:grep Hello ./*(D)
./
( 로 시작하는 파일 이름 도 필요합니다-
.) 또는:(set -o dotglob; grep Hello ./*)
glob의 또 다른 장점
zsh
은 일반 파일만 필요하도록 지정할 수 있다는 것입니다(.
glob 한정자를 사용하여).grep Hello ./*(D.)
ksh93
:(FIGNORE='.?(.)'; grep Hello ./*)
bash
:(shopt -s dotglob; grep Hello ./*)
tcsh
:(set globdot; grep Hello ./*)
fish
:grep Hello {.,}*
Forsyth 쉘 및 그 파생물(
pdksh
, OpenBSDsh
, ,posh
...mksh
) 및fish
:grep Hello ./.* ./*
rc
,es
:grep Hello ./.[~.]* ./..?* ./*
Bourne 쉘, ksh88 및 Almquist 쉘 파생물:
grep Hello ./.[!.]* ./..?* ./*
csh
:grep Hello ./.[^.]* ./..?* ./*
zsh
, (t)csh
및 를 사용 fish
하면 glob이 어떤 파일과도 일치하지 않으면 명령이 실행되지 않습니다. 다른 셸에서는 일치하지 않는 glob이 그대로 전달되고 grep
해당 grep
파일이 존재하지 않는다는 불만이 표시됩니다.
답변4
*
다른 사람들은 점으로 시작하는 파일은 일치하지 않을 것이라고 올바르게 말했습니다 . 다양한 솔루션이 많은 답변에 제공되며, 대부분은 몇 가지 구멍이 있습니다(예: . & ..; 포함 또는 여러 점으로 시작하는 파일 제외, 하위 디렉터리 포함, 매우 긴 명령 포함 - OK). 이 모든 것은 다음을 제공합니다. 문제에 대한 몇 가지 새로운 관점.
(bash 사용자를 위한) 내 간단한 솔루션은 다음과 같습니다.shopt -s dotglob
*glob에 도트 파일을 포함하도록 bash에 지시하려면 이것을 사용하십시오 ..
POSIX 호환성이나 다른 셸 사용의 경우 다른 답변이 유용하길 바랍니다.
shopt -s dotglob
솔루션 하이라이트: 포함되지 않습니다. 그리고.. ; 하위 디렉터리를 재귀적으로 포함하지 않습니다. .bashrc 파일에 배치할 수 있습니다.