如何找到tree
所拥有的文件和tree
拥有的群组?如何找到tree
所拥有文件的整个目录?
答案 0 :(得分:3)
File::Find模块是标准的Perl模块(即,它可以在所有Perl安装中使用)。您可以使用File :: Find来浏览目录树并搜索所需的文件。
要使用,您需要创建一个解析文件的wanted
子例程,然后让find
子例程在其调用中包含wanted
例程。 File::Find
模块有点klutzy,因为它最初只用于find2perl命令。
这是一些完全未经测试的代码。请注意,您可以使用全局变量和包变量等令人讨厌的东西。这是我不喜欢File::Find
的原因之一。
use File::Find;
our $myUid = getpwnam('tree');
our $muGid = getgrnam('tree');
find (\&wanted, @dirList);
sub wanted {
my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, $atime,$mtime,$ctime,$blksize,$blocks) = stat($File::Find::name);
next if (not -f $File::Find::name);
next if ($uid != $myUid);
next if ($gid != $myGid);
print qq(File "$File::Find::name" is owned by group 'tree' and user 'tree'\n);
}
我编写了自己的File::Find
File::OFind
,因为它更面向对象。你可以从here获得。理解起来要容易一些。 (再次,完全未经测试):
use File::OFind;
# Really should test if these return something
my $myUid = getpwnam('tree');
my $muGid = getgrnam('tree');
# Create your directory search object
my $find = File::OFind->new(STAT => 1, $directory);
# Now keep looping and examining each file
while($find->Next) {
next if ($find->Uid != $myUid);
next if ($find->Gid != $myGid);
next if ($find->Type ne "f"); #Is this a file?
print $find->Name . " is owned by group and user tree\n";
}
答案 1 :(得分:0)
完成此任务所需的内置Perl函数包括getpwnam
,getgrnam
和stat
。
($name,$passwd,$uid,$gid,
$quota,$comment,$gcos,$dir,$shell,$expire) = getpwnam 'tree';
将返回有关用户tree
的大量有用信息。对于此任务,您将对$uid
字段特别感兴趣。同样地,
($name,$passwd,$gid,$members) = getgrnam 'tree';
检索有关组tree
的数据。您将对$gid
字段最感兴趣。最后,stat
函数
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
$atime,$mtime,$ctime,$blksize,$blocks)
= stat($filename);
返回一个包含有关文件(或目录)的系统信息的13元素数组。对于您的任务,您正在查找文件,以便从stat($filename)
返回的用户和组ID与从getpwnam
和getgrnam
返回的用户和组ID匹配。
答案 2 :(得分:0)
File :: Find :: Rule使这个简洁明了:
use File::Find::Rule;
my $uid_tree = getpwnam('tree');
my $gid_tree = getgrnam('tree');
my @files =
File::Find::Rule
->file()
->uid($uid_tree)
->gid($gid_tree)
->in('.');
价: