每当使用以下命令调用更改事件时,是否可以查看哪些文件已更改: https ://metacpan.org/pod/Mac::FSEvents ?
非常感谢!:)
文件系统事件 API 旨在镜像大型文件更改树,如果您想镜像特定的文件更改,最好使用IO::KQueue。perl 绑定缺少一些用于事件标志的常量,但您可以从File System Events Programming Guide获得这些。
这个脚本应该让你开始,它打印出任何文件事件'/path'
#!/usr/bin/perl
use strict;
use warnings;
use IO::Select qw[];
use Mac::FSEvents qw[FILE_EVENTS];
my $fse = Mac::FSEvents->new({
path => '/path',
flags => FILE_EVENTS
});
my $select = IO::Select->new($fse->watch);
# http://developer.apple.com/library/mac/#documentation/Darwin/Reference/FSEvents_Ref/FSEvents_h/index.html#//apple_ref/c/tag/FSEventStreamEventFlags
my %names = reverse (
kFSEventStreamEventFlagNone => 0x00000000,
kFSEventStreamEventFlagMustScanSubDirs => 0x00000001,
kFSEventStreamEventFlagUserDropped => 0x00000002,
kFSEventStreamEventFlagKernelDropped => 0x00000004,
kFSEventStreamEventFlagEventIdsWrapped => 0x00000008,
kFSEventStreamEventFlagHistoryDone => 0x00000010,
kFSEventStreamEventFlagRootChanged => 0x00000020,
kFSEventStreamEventFlagMount => 0x00000040,
kFSEventStreamEventFlagUnmount => 0x00000080,
kFSEventStreamEventFlagItemCreated => 0x00000100,
kFSEventStreamEventFlagItemRemoved => 0x00000200,
kFSEventStreamEventFlagItemInodeMetaMod => 0x00000400,
kFSEventStreamEventFlagItemRenamed => 0x00000800,
kFSEventStreamEventFlagItemModified => 0x00001000,
kFSEventStreamEventFlagItemFinderInfoMod => 0x00002000,
kFSEventStreamEventFlagItemChangeOwner => 0x00004000,
kFSEventStreamEventFlagItemXattrMod => 0x00008000,
kFSEventStreamEventFlagItemIsFile => 0x00010000,
kFSEventStreamEventFlagItemIsDir => 0x00020000,
kFSEventStreamEventFlagItemIsSymlink => 0x00040000
);
use constant kFSEventStreamEventFlagItemIsFile => 0x00010000;
while ($select->can_read) {
for my $event ($fse->read_events) {
my $flags = $event->flags;
my @names;
next unless $flags & kFSEventStreamEventFlagItemIsFile;
while ((my $flag = $flags & -$flags) != 0) {
push @names, $names{$flag} || sprintf '0x%.8X';
$flags &= ~$flag;
}
printf qq['%s': %s\n], $event->path, join ' | ', @names;
}
}
$fse->stop;
示例事件:
$ echo foo > foo.txt
'/path/foo.txt': kFSEventStreamEventFlagItemCreated | kFSEventStreamEventFlagItemModified | kFSEventStreamEventFlagItemIsFile
$ touch foo.txt
'/path/foo.txt': kFSEventStreamEventFlagItemInodeMetaMod | kFSEventStreamEventFlagItemIsFile
$ echo foo >> foo.txt
'/path/foo.txt': kFSEventStreamEventFlagItemModified | kFSEventStreamEventFlagItemIsFile
$ mv foo.txt bar.txt
'/path/foo.txt': kFSEventStreamEventFlagItemRenamed | kFSEventStreamEventFlagItemIsFile
'/path/bar.txt': kFSEventStreamEventFlagItemRenamed | kFSEventStreamEventFlagItemIsFile
$ rm bar.txt
'/path/bar.txt': kFSEventStreamEventFlagItemRemoved | kFSEventStreamEventFlagItemIsFile