在没有dos2unix的情况下递归转换目录和子目录中所有文件的所有EOL(dos-> unix)

时间:2012-05-17 02:50:13

标签: linux bash unix command-line end-of-line

如何以递归而不是 dos2unix转换目录和子目录中所有文件的所有EOL(dos-> unix)? (我没有它,也无法安装它。)

有没有办法使用tr -d '\r'和管道?如果是这样,怎么样?

6 个答案:

答案 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//'