grep은 점으로 시작하는 파일을 무시합니다.

grep은 점으로 시작하는 파일을 무시합니다.

예를 들어 보겠습니다.

$ 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와 같은 파생물)을 기반으로 하는 쉘을 제외하고 디렉토리를 검색할 때 불만이 발생한다는 것입니다.fishpdkshmkshposhshgrep...

$ 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, OpenBSD sh, , 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 파일에 배치할 수 있습니다.

관련 정보