iconv завершен сигналом 7

В некоторых текстовых файлах я запускал небольшой скрипт bash:

find . -name "*.dat" -exec iconv --from-code='UTF-8' --to-code='ASCII//TRANSLIT' {} --output={} \; 

Моя машина – Ubuntu 14.04 LTS.

Через некоторое время я обнаружил, что половина данных в файлах исчезла; просто срезайте в середине строки / слова. Это таинственный signal 7 или свалка ядра (как я слышал). Проблема в том, что когда файлы слишком большие. Некоторые из моих файлов имеют> 60 КБ, но iconv сделал их вокруг 30 КБ.

Что я могу сделать по этому поводу? Это ошибка? Есть ли обходной путь? Есть ли другой удобный способ транслитерации диакритики?

  • сравнение полей в разных текстах (с повторными полями)
  • Как получить сортировку, чтобы показать мне результаты в порядке, подобном человеку?
  • Как удалить русские и арабские строки из текстового файла
  • Цветной `cat` для исходных файлов и файлов сценариев?
  • Проблема с вставкой новой строки между странными html-символами в html-файле - UTF-8
  • Как добавить имя, дату и размер жесткого диска
  • Сравните столбцы разных файлов разных размеров и замените значения несоответствия NA
  • Недостаточно места на диске: удалите первые n строк текстового файла без копирования файла
  • One Solution collect form web for “iconv завершен сигналом 7”

    Как указано в комментариях к моему вопросу, проблема возникает, когда выполняются два условия:

    1. Исходный и целевой файл те же.
    2. Файл больше 32768 байт.

    Существует два решения: либо использовать временный файл, который затем автоматически заменяет исходный файл, либо использует recode .

    Что касается первого решения, см., Например. https://unix.stackexchange.com/a/10243/94483 . Для sponge есть очень хороший вопрос о SO ( https://stackoverflow.com/q/64860/362146 ), а также ответ здесь: https://unix.stackexchange.com/a/19980/94483

    Теперь я буду использовать iconv поскольку recode поддерживает меньше наборов символов (и я также не смог запустить его):

     FILELIST=$(find . -type f -name "*.dat") for file in $FILELIST do iconv --from-code='UTF-8' --to-code='ASCII//TRANSLIT' "$file" | sponge "$file" done 

    sponge выполняет заменяющее задание. Это больше .

    Linux и Unix - лучшая ОС в мире.