一. 文件测试
- 获得帮助
perldoc -f -e
- 测试应用
#-e 测试文件是否存在
die "Oops!A file called '$filename' already exists.\n" if -e $filename;
#-M 文件最后一次修改时间到当前时刻之间的天数
warn "Config file is looking pretty old~\n" if -M CONFIG > 28;
#-s 返回文件的字节大小 -A 文件最后一次访问到当前时刻的天数
#使用and连接多项测试
foreach my $filename (@original_files){
push @big_old_files, $filename if -s $filename > 100_000 and -A $filename >90;
}
if(-r $file and -w $file){
...
}
- 常用文件测试符
文件测试符 | 说明 |
---|---|
-r | 文件或目录,对当前用户/组是可读的 |
-w | 文件或目录,对当前用户/组是可写的 |
-x | 文件或目录,对当前用户/组是可执行的 |
-o | 文件或目录,由当前用户所拥有 |
-R | 文件或目录,对实际的用户或组可读 |
-W | 文件或目录,对实际的用户或组可读 |
-X | 文件或目录,对实际的用户或组可执行 |
-O | 文件或目录,由实际用户所拥有 |
-e | 文件或目录是存在的 |
-z | 文件为空 |
-s | 返回文件的字节数 |
-f | 是普通文件 |
-d | 是目录 |
-l | 是符号链接 |
-S | 是Socket类型文件 |
-p | 是命名管道 |
-b | 是块设备 |
-c | 是字符设备文件 |
-u | 设置了SUID |
-g | 设置了SGID |
-k | 设置了Sticky-bit |
-t | 是TTY设备 |
-T | 看起来像文本文件 |
-B | 看起来像二进制文件 |
-M | 最后一次修改到今天的天数 |
-A | 最后一次访问到今天的天数 |
-C | 最后一次inode被修改到今天的天数 |
注:当前用户/组指当前运行程序的人。
- 测试统一文件的多项属性
“ _ ” 虚拟文件句柄,它会告诉Perl用上次查询过的文件信息来做当前测试。这样只需要查询一次文件信息即可。
if(-r $file and -w _){
...
}
或者
if(-r $file){
...
}
if(-w _){
...
}
或者采用栈式文件测试
if(-w -r -x -o -d $file){
...
}
if((-d $file and -s _) < 512){
...
}
或者
if(-d $file and -s _ < 512){
...
}
二. 目录操作
- cd
chdir '/etc/' or die "can't cd to /etc/: $!";
- 文件名展开
shell中有
$ echo *.pl
test1.pl test2.pl test3.pl test4.pl
在perl中使用glob会产生相同效果。
my @pm_files=glob '*.pm';
- 目录句柄
目录句柄操作得到的是目录中的文件。
my $dir_to_process='/etc';
opendir my $dh, $dir_to_process or die "Can't open $dir_to_process: $!";
foreach $file (readdir $dh){
print "one file in $dir_to_process is $file\n";
}
closedir $dh;
也可以将$dh换成裸字“ DIR ”作为目录句柄。
- 新建目录
mkdir 'fred', 0755 or warn "Can't create fred dir: $!\n";
mkdir $name, oct($perms);
- 删除目录
删除空目录
rmdir $temp_dir;
完整方案参考File::Path模块。
三. 文件操作
- 删除文件
unlink 'file1', 'file2', 'file3';
或者
unlink qw( file1, file2, file3 );
- 删除多个文件
#unlink返回成功删除的文件数
unlink glob '*.o';
或者
foreach my $file (qw(file1 file2 file3)){
unlink $file or warn "failed on $file: $!\n";
}
注意:删除文件的权限和文件本身的权限无关,它取决于文件所在目录的权限。
- 重命名文件
rename 'old', 'new'; #这里的,可以替换为=>
这里rename功能和shell的mv命令功能相同。
一个例子
foreach my $file (glob "*.old"){
my $newfile=$file;
$newfile =~ s/\.old$/.new/;
if(-e $newfile){
warn "can't rename $file to $newfile: $newfile exists\n";
}elsif(rename $file => $newfile){}
else{
warn "rename $file to $newfile failed: $!\n";
}
}
-
PID文件
Perl会将进程的PID存入“ $$ ”默认变量中。 -
修改权限
chmod 0755, 'fred', 'barney';
- 修改隶属关系
my $user=1004;
my $group=100;
或者
defined(my $user=getpwnam 'user1') or die 'bad user';
defined(my $group=getgrnam 'group1') or die 'bad group';
chown $user, $group, glob '*.o';
defined函数用于检查返回值不是undef。