目前,我正在使用以下命令来更改 dos2unix 行尾,但这是针对 file-y 文件...
sed -i 's/\r//' filename
有没有办法为目录中的所有文件运行此命令?
递归运行整个目录的最简单方法dos2unix
是让find
命令根据您的条件为它找到的每个文件执行它。
例如,要查找当前目录及其所有子目录中的所有文件(不包括目录名称),dos2unix
并对每个文件进行默认转换:
find . -type f -exec dos2unix -k -s -o {} ';'
这将输出每个文件名,但不一定要更改每个文件名。这工作如下:
find .
:在此目录中查找任何内容,包括其子目录,以及这些子目录中的任何内容(递归)
-type f
:仅返回“常规文件”名称。从结果中排除文件夹名称。
-exec
:对每个结果执行以下命令。超出此点的所有内容都应视为该命令的一部分,直到;
找到该字符。
dos2unix
:dos2unix
将使用以下选项执行...
-k
:保持输出文件的日期戳与输入文件相同
-s
:跳过二进制文件(图像、档案等)。默认情况下包含此选项,但无论如何我都会使用它,以防某些系统上的默认设置不同(例如 OS X v. Debian v. CentOS v. Ubuntu v. ...)。
-o
:将更改直接写入文件,而不是使用新格式的数据创建新文件。
{}
:这告诉find
插入它找到的文件名作为dos2unix
调用的参数。
';'
: 告诉find
参数 fordos2unix
已经结束。超出此点的任何内容将再次被视为 的参数find
。
简单的:
sed -i 's/\r//' filename1 filename2 … filenameN
或者,如果您正在谈论一个目录的内容
sed -i 's/\r//' *
对我来说工作得很好。
dos2unix *.txt
可以很好地转换目录中的所有 *.txt 文件...不需要“查找”命令。
另外一个选项:find your_dir type f -exec sed -i 's/\r//' {} \;
你为什么不使用 dos2unix 命令?如果您只执行上面的 sed,则可能存在具有不正确 EOF 的文件(取决于其来源)(如果您运行 cat 并且随后的提示将连接到文件输出,则可以看到它)
for i in `find . -type f \( -name "*.c" -o -name "*.h" \)`; do sed -i 's/\r//' $i ; done
只需添加另一个参考...
在 Ubuntu 14.04 上,该man dos2unix
页面提供了这个示例,专门用于递归转换:
find . -name *.txt | xargs dos2unix
从手册页引用,这将
...转换当前目录下目录树中的所有.txt文件...
find $(pwd) -type f | xargs -I xxx sed -i 's/\r//g' xxx