Вам нужно записать смещение, в котором вы находились в конце.
Было бы проще использовать ksh93 или zsh, у которых для этого есть встроенные операторы вместо bash.
Например, с ksh93:
#! /bin/ksh93
file=/some/file.log
offset_file=$file.offset
offset=$(<"$offset_file")
{
do-your-processing; ret=$?
echo "$(<#((CUR)))" > "$offset_file" && exit "$ret"
} < "$file" <#((offset))
Сzsh
:
#! /bin/zsh
zmodload zsh/system
file=/some/file.log
offset_file=$file.offset
offset=$(<$offset_file)
{
sysseek offset || exit
do-your-processing; ret=$?
echo $((systell(0))) > $offset_file && exit $ret
} < $file
С bash
вы можете сделать большую часть из вышеперечисленного и вызвать ksh93
, zsh
или perl
для поиска/сообщения:
#! /bin/bash
file=/some/file.log
offset_file=$file.offset
offset=$(<"$offset_file")
seek() {
OFFSET=$1 perl -e '
seek(STDIN, $ENV{OFFSET}, 0) || die "seek: $!\n"'
}
tell() {
perl -le 'print tell(STDIN)'
}
{
seek "${offset:-0}" || exit
do-your-processing; ret=$?
tell > "$offset_file" && exit "$ret"
} < "$file"
Вы хотите убедиться, что всякий раз, когда файл усекается, файл file.offset пуст, усечен или в него записано 0.
Вы также можете попробовать использовать:
sudo tune2fs -L {label} {devicename}
или
sudo e2label {device} {label}
для форматов файлов ext[2,3,4].
Вы также можете использоватьGparted