git bash에서 dos 형식 파일을 감지하는 방법

git bash에서 dos 형식 파일을 감지하는 방법

Git Bash는 Windows에 Git을 설치할 때 얻을 수 있는 멋진 bash 쉘입니다. grep, sed, awk 및 Perl과 같은 다른 일반적인 UNIX 도구가 내부적으로 번들로 제공됩니다. 파일 명령이 없습니다.

이 셸에서는 DOS 스타일 줄 끝이 있는 파일을 감지하고 싶습니다. 이 명령이 작동할 줄 알았는데 작동하지 않습니다.

grep -l ^M$ *

파일에 CR 줄 끝 일치가 없어도 작동하지 않습니다. 예를 들어, 2개의 샘플 파일을 생성 hello.unix하고 추가 CR로 인해 6자와 7자가 있음을 hello.dos확인할 수 있지만 두 파일 모두 .wchello.unixhello.dosgrep

$ cat hello.*
hello
hello

$ wc hello.*
      1       1       7 hello.dos
      1       1       6 hello.unix
      2       2      13 total

$ grep -l ^M hello.*
hello.dos
hello.unix

grep이것은 Git Bash 구현의 버그입니까? DOS 스타일 줄 끝이 있는 모든 파일을 찾는 다른 방법이 있습니까?

답변1

편집 : 바보 같은 나. 물론 ^M은 CR이므로 명령이 작동해야 합니다(제 시스템에서는 작동했습니다). 그러나 리터럴 '\r'/CR(두 문자 ^sum 대신 M)을 얻으려면 Ctrl-V Ctrl-M을 입력해야 합니다.

대안:

이 작업을 수행:

find dir -type f -print0 | xargs -0 grep -l `printf '\r\n'`

아니면 이거:

find dir -type f -print0 | xargs -0 grep -lP '\r\n'

파일 유틸리티를 사용할 수도 있습니다(GIT bash와 함께 제공되는지는 확실하지 않음).

find dir -type f -print0 | xargs -0 file | grep CRLF

답변2

나는 git bash를 모르지만 어쩌면

if [ "$(tr -cd '\r' < file | wc -c)" -gt 0 ]; then
  echo there are CR characters in there
fi

작동합니다. 아이디어는 사용하지 않는 것입니다텍스트CR 및 LF 문자를 특별히 처리하는 유틸리티입니다.

그래도 안되면 아마도

if od -An -tx1 < file | grep -q 0d; then
  echo there are CR characters in there
fi

후크 조회:

find . -type f -exec sh -c 'od -An -tx1 < "$1" | grep -q 0d' sh {} \; -print

답변3

@sch는 나를 다음 솔루션으로 이끌었습니다.

sed -bne '/\r$/ {p;q}' < /path/to/file | grep -q .

파일에 CR로 끝나는 줄이 있으면 TRUE로 종료합니다. find에 연결하려면 다음을 수행하십시오.

find /path/to/ -type f -exec sh -c 'sed -bne "/\r$/ {p;q}" < "$1" | grep -q .' sh {} \; -print

grep -l ^M hello.*이 셸에서 이것이 작동하지 않는 이유를 알 것 같습니다 . Git Bash에서는 ^M문자가 모든 명령줄 인수에서 제거되어 grep문자가 실제로 수신되지 않으므로 모든 파일이 일치하는 것 같습니다. 이 동작은 명령줄뿐만 아니라 쉘 스크립트에서도 발생합니다.

그래서 문자 그대로의 의미보다는 와 ^M같은 다른 기호를 사용하여 문자를 표현하는 것이 핵심입니다 .\r

답변4

Linux/Ubuntu에서는 file 명령을 사용하십시오. 파일이 DOS 형식인 경우 출력에는 "CRLF 줄 종결자 사용"이라는 단어가 포함됩니다. 파일이 UNIX 형식인 경우 해당 단어는 출력에 표시되지 않습니다. 다음 예에서 del.txt는 DOS 형식이고 del은 UNIX 형식입니다.

$ file del.txt
del.txt: C source, ASCII text, with CRLF line terminators
$ echo "hello" > del
user@decatur2:~/manpuriav$ file del
del: ASCII text

관련 정보