让 txt 文件在通过 Curl 通过 FTP 发送后保留其换行符

让 txt 文件在通过 Curl 通过 FTP 发送后保留其换行符

我正在使用 Curl 通过 FTP 发送文件。它只是通过屏幕硬拷贝命令生成的文本文件。当我 cat 该文件时,它会正确显示,如下所示:

System up for    14844
 1, 0000, R D S, 0, 0, x, 0.00
 2, 0000, R D S, 0, 0, x, 0.00
 3, 0000, R D S, 0, 0, x, 0.00
 4, 0000, R D S, 0, 0, x, 0.00

但是当我查看传输的文件时,所有内容都在一行上。有什么办法可以解决这个问题吗?有命令行选项吗?这是我的 curl 命令:

curl -T ~/hardlog.log ftp://10.0.0.7 --user user:secret

谢谢

答案1

正如前面提到的,这是行尾不兼容的典型症状。在这种情况下,源系统是类 Unix(Linux),而目标系统是类 Windows。在 Windows 中,Unix 换行符无法识别,因此文本文件显示为一条长行。在这种情况下,您应该进行换行符转换。

尽管 FTP 协议内置了换行转换功能卷曲即使使用-Q '+TYPE A'选项强制 ASCII 传输也不支持它。

最方便的选择是在传输之前使用脚本在 Linux 上进行转换:

#!/bin/sh
SRCFILE=~/hardlog.log
DSTLOGIN=user:secret
DSTURL=ftp://10.0.0.7/              # the URL must end by a slash

unix2dos <"$SRCFILE" | curl -T- "$DSTURL$(basename "$SRCFILE")" -u"$DSTLOGIN"

如果unix2dos您的系统上没有该实用程序,您可以使用sed 's/$/\r/'awk '{printf("%s\r\n",$0)}'代替。请参阅unix2dos 转换的替代方案

另一个选择是使用支持 ASCII 传输的客户端,例如低速FTP。 例子:

lftp -e "put -a $HOME/hardlog.log ; exit" -u user,secret 10.0.0.7

笔记:在 Windows 上,有一些文本编辑器能够处理 Unix 换行符,例如写字板或一些第三方的:记事本++记事本2. 最后两个编辑器也可以用于换行转换。

答案2

这是一个粗糙但有效的小循环,它在文件中每一行文本的末尾添加一个换行符。

    today=`date +%m%d` # file name filter
    for file in *${today}*
    do
      > ${file}.tmp
      while read readline
      do
        echo -e "$readline\n">> ${file}.tmp
      done <${file}
      cp ${file}.tmp ${file}
      rm ${file}.tmp
    done

相关内容