Perl-目录操作4

1. 创建和删除目录

调用mkdir函数再现有目录下创建新目录

mkdir 'fred', 0755 or warn "Cannot make fred directory: $!";

0755代表目录的初始权限,写成八进制数值,是因为它会被解释成三位一组的Unix权限值,适合用八进制来表示

像之前提过的那样,想当成数字来用的字符串即使以0开头,也不会被解释成八进制数字,所以下面这么写是行不通的

my $name = "fred";
my $permissions = "0755"; # 危险,不能这样写!
mkdir $name, $permissions;

因为0755会被当成十进制处理,所以相当于我们用奇怪的01363权限值建立了一个目录。要正确处理字符串,需要使用oct()函数,它能强行把字符串当成八进制数字处理,无论它是否以0开头

mkdir $name, oct($permissions);

在程序中指定权限时,不必使用字符串,直接用数字就可以了。通常是在使用用户键入的权限值时才会需要额外的oct()函数

my ($name, $perm) = @ARGV;
mkdir $name, oct($perm) or die "cannot create $name: $!";

可以用rmdir函数来删除空目录,它的用法和unlink函数很像,只是每次调用只能删除一个目录

foreach my $dir(qw(fred barney betty)){
	rmdir $dir or warn "cannot rmdir $dir: $!\n";
}

如果对非空目录调用rmdir函数会导致失败,可以先用unlink删除目录中的内容,再试着移除已经清空的目录

my $temp_dir = "/tmp/scratch_$$"; # 在临时文件的名称中使用了当前进程ID
mkdir $temp_dir, 0700 or die "cannot create $temp_dir: $!";
...
# 将临时目录$temp_dir 作为临时文件存放
...
unlink glob "$temp_dir/* $temp_dir/.*"; # 删除临时目录$temp_dir中所有的文件
rmdir $temp_dir; # 现在是空目录,可以删除了

如果真的要创建临时目录或文件,可以用File::Temp模块

初始的临时目录名将会包含当前的进程标识符,每个当前运行着的进程都会有这么一个独一无二的数字代号,在perl里会把这个代号存储在变量$$

程序中最后的unlink会移除临时目录里的所有文件,然后rmdir函数才有办法将清空后的目录删除。不过,如果我们在临时目录里创建了子目录,那么unlink操作符在处理它们时将会失败,rmdir也会跟着失败

perl自带的File::Path模块中的remove_tree函数比较好用!

2. 修改权限

perl中的chmod函数可以用来修改文件或目录的权限

chmod 0755, 'fred', 'barney';

和许多其它操作系统的接口函数一样,chmod会返回更改的条目数量
第一个参数代表unix的权限位,这个值一般是八进制形式,perl的chmod函数不能接受符号表示的权限(除非安装了File::chmod模块)

3. 修改文件属主

只要操作系统允许,可以用chown函数修改一系列文件的属主以及其用户组。
属主和用户组会被同时更改,并且在指定是必须给定数字形式的用户标识符及组标识符

my $user = 1004;
my $group = 100;
chown $user, $group, glob '*.o';

可以用getpwnam函数将用户名转换成用户编号,用相应的getgranm函数将用户名转换成组编号

defined(my $user = getpwnam 'merlyn') or die 'bad user';
defined(my $group = getgrnam 'users') or die 'bad group';
chown $user,$group, glob '/home/merlyb/*';

成功操作后,chown函数会返回修改过的文件数量,失败的话则在$!中设定出错信息

4. 修改时间戳

有时候我们想修改某个文件最近的更改或访问时间以欺瞒其它程序,我们可以用utime函数来造假!utime函数的前两个参数是新的访问时间和更改时间,其余参数是要修改时间戳的文件名列表。时间格式采用的是内部时间戳的格式

my $now = time;
my $ago = $now - 24 * 60 * 60; # 一天的秒数
utime $now, $ago, glob '*'; # 将最后访问时间改成当前时间,最后修改时间改成一天前

在文件有任何更改时,第三个时间戳(ctime值)一定会被设成当前时刻,所以没有函数可以篡改它(就算用utime修改成功,它也会力可被设回当前时刻)
因为它主要是给增量备份的程序用的:如果某个文件的ctime比磁带上的新那它就该再次备份了

你可能感兴趣的:(perl,unix,开发语言)