Git Bash는 Windows에 Git을 설치할 때 얻을 수 있는 멋진 bash 쉘입니다. grep, sed, awk 및 Perl과 같은 다른 일반적인 UNIX 도구가 내부적으로 번들로 제공됩니다. 파일 명령이 없습니다.
이 셸에서는 DOS 스타일 줄 끝이 있는 파일을 감지하고 싶습니다. 이 명령이 작동할 줄 알았는데 작동하지 않습니다.
grep -l ^M$ *
파일에 CR 줄 끝 일치가 없어도 작동하지 않습니다. 예를 들어, 2개의 샘플 파일을 생성 hello.unix
하고 추가 CR로 인해 6자와 7자가 있음을 hello.dos
확인할 수 있지만 두 파일 모두 .wc
hello.unix
hello.dos
grep
$ 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