1

Я использую Curl для отправки файла по FTP. Это просто сгенерированный текстовый файл из команды hardcopy. Когда я кошку файл, он отображается правильно, это выглядит так:

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

Спасибо

2 ответа2

2

Как уже упоминалось, это классический признак несовместимых окончаний строк. В этом случае исходная система похожа на Unix (Linux), а назначение - на Windows. В Windows новые строки Unix не распознаются, поэтому текстовый файл отображается в виде одной длинной строки. В таких случаях вы должны сделать перевод новой строки.

Хотя протокол FTP имеет преобразование новой строки, встроенный Curl не поддерживает его, даже если форсировать передачу ASCII с помощью опции -Q '+TYPE A' .

Наиболее удобным вариантом было бы сделать преобразование в 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, например LFTP. Пример:

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

Примечание. В Windows есть текстовые редакторы, способные работать с новыми строками Unix, такими как Wordpad или некоторые сторонние: Notepad++, Notepad2. Последние два редактора также могут быть использованы для преобразования новой строки.

-1

Вот грубый, но эффективный маленький цикл, который добавляет новую строку в конец каждой строки текста в файле.

    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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .