前提:文件最后一行有换行符

第一步:以二进制方式取得文件最后两个byte。
last2=`tail -c 2 <your_file> | od -x -A n`

第二步:判断最后两个byte是否是'CRLF'
if [ $last2 = 0a0d -o $last2 = 0d0a ]
then
# Cheating! If the file ends in LFCR, it would incorrectly
# say that it is CRLF
echo File ends in CRLF
fi


另外,下面这种方法的原理,让人百思不得其姐,
#重定向标准输入
exec < <your_file>
read -r line
case $line in *$'\r') return 1;; *) return 0;; esac

原以为read加了-r就可以把$'\n'读出来,实际上却是用read把末尾的$'\n'先去掉,剩下的如果是$'\r'就认为是'CRLF'换行。
这个语句表明read一定会去掉末尾的$'\n'

PS:Shell里$'\r'和$'\n'就这么写


完整代码

#!/bin/bash

if [ $# -eq 0 ] ; then
echo "error : there is no para"
exit 1
fi

if [ ! -e $1 ] ; then
echo "file $1 is not exist"
exit 1
fi

last2=$(tail -c 2 "$1" | od -x -A n)

if [ $last2 = 0a0d -o $last2 = 0d0a ] ; then
echo "end with \\r\\n"
else
echo "end with \\n"
fi


遍历文件夹版

#!/bin/bash

#func check CRLF bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
check_CRLF(){
last2=$(tail -c 2 "$1" | od -x -A n)

echo "last2 is $last2"
if [ $last2 = 0a0d -o $last2 = 0d0a ] ; then
echo "warning! file $1 end with \\r\\n"
else
echo "file $1 end with \\n"
fi
}

#func traverse folder bbbbbbbbbbbbbbbbbbbbbbbbbbbb
traverse_folder(){

# no para
if [ $# -eq 0 ]; then
exit 1
fi

# not folder
if [ ! -d $1 ]; then
exit 1
fi

# traversal
for files_or_folder in $1/*
do
# is file
if [ -f $files_or_folder ]; then
check_CRLF $files_or_folder
# is folder
elif [ -d $files_or_folder ]; then
traverse_folder $files_or_folder
else
exit 1
fi
done
}

#bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
if [ $# -eq 0 ] ; then
echo "error : there is no para"
exit
fi

traverse_folder $1


一句搞定版

find . -type f | xargs file | grep CRLF

最新文章

  1. IOS开发-KVC
  2. sqlite3 not found问题解决方法
  3. spring注入静态成员变量提示invalid setter method
  4. 管理系统的前端解决方案:Pagurian V1.3发布
  5. [原创]JavaScript继承详解
  6. -25299 reason: &#39;Couldn&#39;t add the Keychain Item.&#39;
  7. android控件---自定义带文本的ImageButton
  8. WebBrowser控件应用:弹出新窗体和关闭窗口
  9. POJ 3468 A Simple Problem with Integers //线段树的成段更新
  10. ios sourecTree
  11. TCP通信中的大文件传送
  12. linux系统编程快速定位头文件的技巧之强大的grep命令
  13. vue项目上传Github预览
  14. jmeter笔记(6)--参数化--函数助手
  15. HTML之表格
  16. postgresql 空间函数 随笔
  17. JSON数据的解析和生成(C++)
  18. C/C++ %s %d %u 基本概念与用法
  19. Android 获取闹钟引发的血案
  20. Java虚拟机九 java.lang.String在虚拟机中的实现

热门文章

  1. javaweb画图
  2. Hugging Face 每周速递: 扩散模型课程完成中文翻译,有个据说可以教 ChatGPT 看图的模型开源了
  3. JS逆向实战11——某金属集团动态cookie加密
  4. RocketMQ - 消费者概述
  5. 有趣的python库-tkinter
  6. JZOJ 【2021.11.10NOIP提高组联考】
  7. 基于ArcGIS的三维路网可视化
  8. 泛型stringToNumber
  9. python collection Chainmap Counter
  10. Visual Studio 2022 不支持 .NET Framework 老版本 项目解决办法