Вы можете вставить строку в середину файла с помощью разумного сочетания seek
и read
, как показано:
$ perl -wMstrict -e '
my $if = shift;
my($str, $ins_pos) = qw/CC 5/;
my($buffer_pre, $buffer_post);
open my $fh, "+<", $if
or die "Opening: $!\n";
# park the pos pointer at the beginning of file
seek $fh, 0, 0 or die "Seeking: $!\n";
my $buffer_pre_size = $ins_pos - 1;
read($fh, $buffer_pre, $buffer_pre_size) == $buffer_pre_size
or die "Reading: $!\n";
# park the pos pointer at the eof
seek $fh, 0, 2 or die "Seeking: $!\n";
my $eof_pos = tell $fh;
my $buffer_post_size = $eof_pos - $ins_pos + 1;
# park the pos pointer at the insertion location
seek $fh, $ins_pos-1, 0 or die "Seeking: $!\n";
read($fh, $buffer_post, $buffer_post_size) == $buffer_post_size
or die "Reading: $!\n";
# park the pos pointer at the beginning of file
seek $fh, 0, 0 or die "Seeking: $!\n";
print $fh $buffer_pre, $str, $buffer_post;
close $fh or die "Closing: $!\n";
' file.txt
Результаты:
1234CC56789
Использование--itemize-changes
(или-i
)вместо -v
дает немного больше информации о причине, по которой что-то происходит с файлами, для которых вы запускаете rsync
.
Например, если для файла была изменена его групповая принадлежность, но ничего больше, вы можете увидеть что-то вроде cf.....g...
для этого файла. Начальный символ — это «тип обновления», а c
означает просто «изменение» (, т. е. не передачу данных файла ). Следующий f
представляет собой тип файла («обычный файл» ). g
дальше по строке означает, что группа источника и цели отличается.
Все это описано в руководстве rsync
. Найдите более подробное описание опции --itemize-changes
.
Когда метаданные файла изменяются, он больше не может быть создан как жесткая ссылка на предварительно -существующую копию того же файла с --link-dest
. Метаданные не могут отличаться для жестких ссылок одного и того же файла.