13

如何在没有的情况下递归地转换目录和子目录中所有文件的所有 EOL (dos->unix ) dos2unix?(我没有,无法安装。)

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

4

7 回答 7

14

For all files in current directory you can do it with a Perl one-liner: perl -pi -e 's/\r\n/\n/g' * (stolen from here)

EDIT: And with a small modification you can do subdirectory recursion:

find | xargs perl -pi -e 's/\r\n/\n/g'
于 2012-05-17T04:13:56.443 回答
11

您可以使用 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
于 2012-05-17T03:12:31.750 回答
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

陷阱的东西可确保您不会留下临时文件。您还可以使用其他技巧,为您的临时文件名提供更多随机名称。除非您在恶劣的环境中工作,否则您通常不需要它们。

于 2012-05-17T03:15:01.877 回答
2

您还可以在批处理模式下使用编辑器。

find . -type f -exec bash -c 'echo -ne "%s/\\\r//\nx\n" | ex "{}" ' \;
于 2012-05-17T09:04:13.900 回答
0

如果\r后面没有\n(可能是 Tim Pote 的文件中的情况):

  • 删除\r(使用tr -d)可能会删除换行符
  • 替换\r\n可能不会导致双/三换行符

也许蒂姆波特可以为他提到的文件验证上述几点。

于 2012-06-26T22:22:47.453 回答
0

这会从当前目录和所有子目录中的所有文件中删除回车,并且应该适用于大多数类 Unix 操作系统:

grep -lIUre '\r' | xargs sed -i 's/\r//'
于 2018-12-20T13:08:00.247 回答
0

如果它在寡妇中完成:

尝试在 git bash 中运行命令:

$ find | xargs perl -pi -e 's/\r\n/\n/g'

它可以显示某种Can't do inplace edit:类型的消息,因此请忽略它

于 2021-09-16T06:07:38.193 回答