【问题标题】:Convert all EOL (dos->unix) of all files in a directory and sub-directories recursively without dos2unix在没有dos2unix的情况下递归转换目录和子目录中所有文件的所有EOL(dos-> unix)
【发布时间】:2012-05-17 02:50:12
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    对于当前目录中的所有文件,您可以使用 Perl 单行:perl -pi -e 's/\r\n/\n/g' *(从 here 窃取)

    编辑:稍作修改,您就可以进行子目录递归:

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

    【讨论】:

    • 如果您的 findxargs 支持它:find -print0 | xargs -0 ... 将处理带有空格的文件名。
    • 如果您在 Git 存储库中使用此命令,请注意。从查找中排除 .git 子目录。
    【解决方案2】:

    您可以使用 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
    

    【讨论】:

    • 这应该处理包含空格的文件名。在每行末尾添加换行符不会导致文件变为双倍行距 - 甚至是三倍行距(因为您要用换行符替换回车符)?是的,我刚刚测试过。
    • @DennisWilliamson 我只是从办公室的脚本中抽出,甚至没有三思而后行。现在我想知道这些脚本是如何工作的。 (这可能与它们旨在转换在 Microsoft Office for Mac 中创建的文件有关。)新版本应该可以正常工作。
    【解决方案3】:

    你的文件名和目录名是否没有空格等?

    如果是这样,那就不太难了。如果您必须处理包含换行符和空格等的任意名称,那么您必须比这更努力。

    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
    

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

    【讨论】:

    • 请注意,tr 实际上可以识别 \r(BSD 和 GNU 变体),因此您可以使用 tr -d '\r'
    【解决方案4】:

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

    find . -type f -exec bash -c 'echo -ne "%s/\\\r//\nx\n" | ex "{}" ' \;
    

    【讨论】:

    • 这个解决方案是唯一一个在 Mac OS X 上对我有用的解决方案。其他人被各种问题挂断了,比如Can't do inplace edit: ./lang is not a regular file, &lt;&gt; line 22167.
    【解决方案5】:

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

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

    也许 Tim Pote 可以为他提到的文件验证上述几点。

    【讨论】:

    • 这在我看来是对 Tim Pote 的回答的一个很好的评论,但它实际上是如何回答这个问题的并不是很清楚。
    【解决方案6】:

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

    grep -lIUre '\r' | xargs sed -i 's/\r//'
    

    【讨论】:

      【解决方案7】:

      如果在寡妇中完成:

      尝试在 git bash 中运行命令:

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

      它可以显示一些Can't do inplace edit: 输入消息所以忽略它

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-31
        • 1970-01-01
        • 2015-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多