Ваше наблюдение
В настоящее время перемещенные файлы сохраняют свои собственные разрешения ACL от того места, где они были созданы, что не соответствует ожиданиям.
blockquote>Кажется, что ожидаемое поведение. После статьи службы поддержки Microsoft Как обрабатываются разрешения при копировании и перемещении файлов и папок .
По умолчанию объект наследует разрешения от своего родительского объекта, либо во время создания, либо когда он копируется или перемещается в родительскую папку. Единственное исключение из этого правила возникает, когда вы перемещаете объект в другую папку на том же томе. В этом случае первоначальные разрешения сохраняются .
BLOCKQUOTE>
Хотя это использовало строки для других целей, я написал код, который делает по существу это прежде.
Все, что необходимо сделать, записать байтовое смещение (с, говорят), и inode (со статистикой) для каждого файла после того, как хвост завершен. В следующий раз это выполняется против файла, сначала проверьте inode (со статистикой) снова. Если inode изменился, или файл меньше, чем зарегистрированное смещение, то это - другой файл (удаленный и воссозданный, журнал был повернут, и т.д.), таким образом, необходимо показать его с начала; иначе ищите на зарегистрированное смещение и отобразите его оттуда.
Может быть этот пакет Perl, может помочь Вам:
Полученный из MultiTail, эта библиотека жемчуга помогает выследить динамический список файлов и строк соответствия/кроме с помощью полных регулярных выражений и даже поддерживает их состояние локально.
Использование В КАЧЕСТВЕ ПРИМЕРА File::Tail::Multi;
$tail1=File::Tail::Multi->new ( OutputPrefix => "f",
Debug => "$True",
Files => ["/var/adm/messages"]
);
while(1) {
$tail1->read;
#
$tail1->print;
sleep 10;
}
$tail1=File::Tail::Multi->new
: Создайте новый объект ptailFiles
=> Файл хвоста/var/adm/messagesOutputPrefix
=> Предварительно ожидают имя начала файла каждой строки в атрибуте объекта "LineArray"$tail1->read
: Считайте всю строку из файлов$tail1->print
: Распечатайте всю строку в атрибуте объекта "LineArray";Я реализовал минимальную версию чистой версии Perl:
#! /usr/bin/perl
# Perl clone of since(1)
# http://welz.org.za/projects/since
#
use strict;
use warnings;
use Fcntl qw/ SEEK_SET O_RDWR O_CREAT /;
use NDBM_File;
my $state_file = "$ENV{HOME}/.psince";
my %states;
tie(%states, 'NDBM_File', $state_file, O_CREAT | O_RDWR, 0660)
or die("cannot tie state to $state_file : $!");
while (my $filename = shift) {
if (! -r $filename) {
# Ignore
next;
}
my @file_stats = stat($filename);
my $device = $file_stats[0];
my $inode = $file_stats[1];
my $size = $file_stats[7];
my $state_key = $device . "/" .$inode;
print STDERR "state_key=$state_key\n";
if (! open(FILE, $filename) ) {
print STDERR "cannot open $filename : $!";
next;
}
# Reverting to the last cursor position
my $offset = $states{$state_key} || 0;
if ($offset <= $size) {
sysseek(FILE, $offset, SEEK_SET);
} else {
# file was truncated, restarting from the beginning
$offset = 0;
}
# Reading until the end
my $buffer;
while ((my $read_count = sysread(FILE, $buffer, 4096)) > 0) {
$offset += $read_count;
print $buffer;
}
# Nothing to read
close(FILE);
$states{$state_key} = $offset;
}
# Sync the states
untie(%states);
@Dave: это почти похоже на Ваш алгоритм, за исключением того, что я не использую, говорят, но внутренний сохраняемый счетчик.