tee -a не воссоздает файл

Похоже, вы были довольно близки. Однако вы не можете отсортировать второе поле численно, потому что оно не полностью числовое (в первой строке есть A ).

Это работает для меня:

sort -t, -k1,1n -k2,2 -k3.7,3.10 -k3.1,3.2n -k3.4,3.5n
7
29.05.2017, 17:55
3 ответа

Если вы хотите восстановить блоки файлов, вам нужно очистить файл, а не удалять его:

Этот портативный способ должен работать с большинством оболочек:

: > /media/pi/KINGSTON/klima.out

Удаление связи с файлом (, т. е. rm), удаляет запись каталога, но не влияет на содержимое файла (inode ), пока файл остается открытым для чтения или записи.

13
27.01.2020, 20:13

Я предполагаю, что ваш конвейер работает в течение длительного времени и вы пытаетесь удалить файл журнала во время его работы.

Когда вы удаляете файл, процесс teeпо-прежнему держит его открытым для записи, что означает, что дисковое пространство не возвращается системе. Этого не произойдет, пока все дескрипторы открытых файлов, которые ссылаются на файл, не будут закрыты.

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

Вам придется перезапустить конвейер для воссоздания файла,и позволить освободить пространство, занимаемое старым (, теперь уже безымянным ), файлом журнала.

Чтобы избежать перезапуска конвейера, вы можете обрезать файл, то есть обрезать его размер до нуля, не удаляя его. Это позволит teeпродолжить добавление к файлу без необходимости его повторного -открытия.

Усечение файла может быть выполнено так, как jlliagre показал в своем ответе , или с помощьюtruncate(нестандартной -утилиты, которая является частью GNU coreutils):

truncate -s 0 /media/pi/KINGSTON/klima.out

См. руководство дляtruncateдля получения дополнительной информации об этой утилите.

19
27.01.2020, 20:13

Вы не понимаете, как система обрабатывает файлы.

Вы удаляете запись файла, но файл все еще существует, пока программа хранит его дескриптор. Таким образом, tee никогда не уведомляется о том, что запись была удалена, и все равно пишет в файл!

Уникальный файл может иметь много записей благодаря жестким ссылкам (, созданным командой ln ).

Вы можете написать свою собственную версию tee, которая будет закрывать и открывать файл при каждой строке, которую он записывает в файл, но это будет очень -неэффективно, так как будет генерироваться слишком много системных вызовов.

Вот функция оболочки -, которая разделит ввод на несколько файлов:

splitSizeInKio=100

splitInput(){
    local PS4='+splitInput+ '
    set -x
    local i=0
    local fname="$1"
    local ii

    while true
    do if [ $i -lt 10 ]
       then ii=0$i
       else ii=$i
       fi
       local outfile="$fname".$ii
       dd of="$outfile" bs=1024 count=$splitSizeInKio
       i=$((i+1))
    done
}

(Вы могли бы использовать "head" вместо "dd", если вы разлили количество строк вместо размера.)

В bash вы можете использовать «подстановку процесса» следующим образом:

prog1 | tee >( splitInput somefilename ) | prog2
4
27.01.2020, 20:13

Теги

Похожие вопросы