转换目录中所有文件的dos2unix行结尾

use*_*146 21 awk sed

Curretly我使用以下命令来更改dos2unix行结尾,但这是for file-y file ..有一种方法可以对目录中的所有文件运行此命令

sed -i 's/\r//' filename
Run Code Online (Sandbox Code Playgroud)

谢谢,

Bry*_*son 32

dos2unix递归方式对整个目录运行的最简单方法是让find命令根据您的条件为它找到的每个文件执行它.

例如,要查找当前目录及其所有子目录中的所有文件(目录名称除外),dos2unix并对每个文件执行默认转换:

find . -type f -exec dos2unix -k -s -o {} ';'
Run Code Online (Sandbox Code Playgroud)

这将输出每个文件名,但不一定会更改每个文件名.其工作原理如下:

find .:在此目录中查找任何内容,包括其子目录,以及这些子目录中的任何内容(递归)
-type f:仅返回"常规文件"名称.从结果中排除文件夹名称.
-exec:对每个结果执行以下命令.除此之外的所有内容都应被视为该命令的一部分,直到;找到该角色.
dos2unix:dos2unix将使用以下选项执行...
-k:保持输出文件的日期戳与输入文件相同
-s:跳过二进制文件(图像,存档等).默认情况下包含此选项,但我仍然使用它,以防某些系统上的默认值不同(例如OS X v.Debian v.CentOS v.Ubuntu v ....).
-o:将更改直接写入文件,而不是使用新格式的数据创建新文件.
{}:这告诉find插入它找到的文件名作为dos2unix调用的参数.
';':告诉已经结束find的参数dos2unix.超出这一点的任何事情将再次被视为参数find.

  • +1用于彻底解释所有命令行选项 (5认同)
  • 请注意:请非常小心确保目录下没有.git,因为它可能包含带有Windows行尾的对象(例如,如果您提交了它们)。它很容易破坏git目录,因为文件目录不再匹配。 (3认同)

Bab*_*avi 5

for i in `find . -type f \( -name "*.c" -o -name "*.h" \)`; do    sed -i 's/\r//' $i ; done
Run Code Online (Sandbox Code Playgroud)

  • 请不要像这样长期犯这种错误的做法(http://mywiki.wooledge.org/BashPitfalls#for_i_in_.24.28ls_.2A.mp3.29)。对于具有特殊字符的文件,此操作将失败,并且可能对您的系统有害。如果您想递归并且正在使用bash,请使用`globstar`。如果不使用bash,则使用`find ... -exec`。但是*请*。 (9认同)

Hub*_*tus 5

简单的:

sed -i 's/\r//' filename1 filename2 … filenameN
Run Code Online (Sandbox Code Playgroud)

或者,如果您正在谈论一个目录的内容

sed -i 's/\r//' *
Run Code Online (Sandbox Code Playgroud)

对我来说工作得很好。