26

目前,我正在使用以下命令来更改 dos2unix 行尾,但这是针对 file-y 文件...

sed -i 's/\r//' filename

有没有办法为目录中的所有文件运行此命令?

4

7 回答 7

43

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

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

find . -type f -exec dos2unix -k -s -o {} ';'

这将输出每个文件名,但不一定要更改每个文件名。这工作如下:

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

于 2013-10-09T22:39:18.287 回答
5

简单的:

sed -i 's/\r//' filename1 filename2 … filenameN

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

sed -i 's/\r//' *

对我来说工作得很好。

于 2014-08-30T07:10:06.343 回答
3
dos2unix *.txt

可以很好地转换目录中的所有 *.txt 文件...不需要“查找”命令。

于 2013-04-04T18:29:09.120 回答
2

另外一个选项:find your_dir type f -exec sed -i 's/\r//' {} \;

你为什么不使用 dos2unix 命令?如果您只执行上面的 sed,则可能存在具有不正确 EOF 的文件(取决于其来源)(如果您运行 cat 并且随后的提示将连接到文件输出,则可以看到它)

于 2013-01-17T09:21:41.150 回答
1
for i in `find . -type f \( -name "*.c" -o -name "*.h" \)`; do    sed -i 's/\r//' $i ; done
于 2013-01-17T06:51:56.657 回答
1

只需添加另一个参考...

在 Ubuntu 14.04 上,该man dos2unix页面提供了这个示例,专门用于递归转换:

find . -name *.txt | xargs dos2unix

从手册页引用,这将

...转换当前目录下目录树中的所有.txt文件...

于 2015-06-09T07:30:36.563 回答
0
find $(pwd) -type f | xargs -I xxx sed -i 's/\r//g' xxx
于 2014-08-25T17:56:22.560 回答