如何以递归而不是 dos2unix
转换目录和子目录中所有文件的所有EOL(dos-> unix)? (我没有它,也无法安装它。)
有没有办法使用tr -d '\r'
和管道?如果是这样,怎么样?
答案 0 :(得分:12)
对于当前目录中的所有文件,您可以使用Perl one-liner执行此操作:perl -pi -e 's/\r\n/\n/g' *
(从here被盗)
编辑:只需稍加修改即可进行子目录递归:
find | xargs perl -pi -e 's/\r\n/\n/g'
答案 1 :(得分:7)
您可以使用sed的-i
标志来就地更改文件:
find . -type f -exec sed -i 's/\x0d//g' {} \+
如果我是你,我会保留文件,以确保操作顺利。然后,您可以在完成后删除临时文件。这可以这样做:
find . -type f -exec sed -i'.OLD' 's/\x0d//g' {} \+
find . -type f -name '*.OLD' -delete
答案 2 :(得分:2)
你有没有空格等的合理文件名和目录名吗?
如果是这样,那就不太难了。如果你必须处理包含换行符和空格等的任意名称,那么你必须比这更努力。
tmp=${TMPDIR:-/tmp}/crlf.$$
trap "rm -f $tmp.?; exit 1" 0 1 2 3 13 15
find . -type f -print |
while read name
do
tr -d '\015' < $name > $tmp.1
mv $tmp.1 $name
done
rm -f $tmp.?
trap 0
exit 0
陷阱内容可确保您不会遗留临时文件。您还可以使用其他技巧,为临时文件名提供更多随机名称。除非你在恶劣的环境中工作,否则通常不需要它们。
答案 3 :(得分:2)
您也可以在批处理模式下使用编辑器。
find . -type f -exec bash -c 'echo -ne "%s/\\\r//\nx\n" | ex "{}" ' \;
答案 4 :(得分:0)
如果\r
后面没有\n
(可能是蒂姆波特文件中的情况):
\r
(使用tr -d
)可能会删除换行符\r
替换为\n
可能不会导致双/三换行也许Tim Pote可以验证他提到的文件的上述要点。
答案 5 :(得分:0)
这将从当前目录和所有子目录中的所有文件中删除回车符,并且可以在大多数类Unix操作系统上使用:
grep -lIUre '\r' | xargs sed -i 's/\r//'