我正在使用 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