Bash

如何在 git bash 中檢測 dos 格式文件

  • July 22, 2015

Git Bash 是您在 Windows 中作為 Git 安裝的一部分獲得的一個不錯的 bash shell。它附帶了其他典型的 unix 工具,例如 grep、sed、awk、perl。它沒有文件命令。

在這個 shell 中,我想檢測具有 DOS 樣式行結尾的文件。我認為這個命令會起作用,但它不會:

grep -l ^M$ *

它不起作用,即使沒有 CR 行結尾的文件也匹配。例如,如果我創建 2 個範例文件hello.unix和,由於額外的 CR,hello.dos我可以確認wchello.unix有 6 個字元並且hello.dos有 7 個字元,但兩個文件都與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

這是grepGit Bash 實現中的錯誤嗎?是否有另一種方法可以找到所有具有 DOS 樣式行結尾的文件?

編輯:愚蠢的我。當然 ^M 是 CR;並且您的命令應該可以工作(在我的系統上工作)。但是,您需要鍵入 Ctrl-V Ctrl-M 才能獲得文字 ‘\r’/CR(而不是兩個字元^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

我不知道 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

引用自:https://unix.stackexchange.com/questions/50565