Bash
如何在 git bash 中檢測 dos 格式文件
Git Bash 是您在 Windows 中作為 Git 安裝的一部分獲得的一個不錯的 bash shell。它附帶了其他典型的 unix 工具,例如 grep、sed、awk、perl。它沒有文件命令。
在這個 shell 中,我想檢測具有 DOS 樣式行結尾的文件。我認為這個命令會起作用,但它不會:
grep -l ^M$ *
它不起作用,即使沒有 CR 行結尾的文件也匹配。例如,如果我創建 2 個範例文件
hello.unix
和,由於額外的 CR,hello.dos
我可以確認wc
它hello.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
這是
grep
Git 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