ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 12.目录操作(perl笔记)

12.目录操作(perl笔记)

原创 Linux操作系统 作者:tonykorn97 时间:2007-06-22 00:00:00 0 删除 编辑
1,在目录树中移动
可以用chdir操作符来改变当前的工作目录
chdir "/etc/" or die "Cannot chdir to /etc: $!";

2,Glob
my @all_files = glob "*";
my @pm_files = glob "*.pm";


2,Glob的另外一种语法
使用“角括号语法”来调用此功能,看起来就跟读取文件句柄差不多:
my @all_files = <*>; # 和my @all_files = glob "*"; 完全一样

角括号之间的值会对双引号内的字符串来进行替换,这表示在进行glob操作之前,角括号内的perl便利会先辈展开成它们当前的值。

my $dir = "/etc";
my @dir_files = <$dir/* $dir/.*>;
此处,因为$dir会被展开当前的值,所以会取得指定目录下任何含点号以及不含点号的文件。

假如角括号既表示从文件句柄读取又代表glob,那perl如何决定用哪一种操作符呢?文件句柄必须是perl标识符。如果角括号内的项目满足perl标识符的条件,就是从文件句柄读取;否则,它代表的是glob。例如:
my @files = ; #glob
my @files = ; #从文件句柄读取


3,目录句柄
若想从目录里取得文件名列表,还可以使用目录句柄。目录句柄看起来像文件句柄,使用起来也没多大的差别。打开(以opendir代替open ),读取内容(以readdir代替readline),关闭(以closedir代替close).
my $dir_to_process = "/etc";
opendir DH, $dir_to_process or die "无法打开 $dir_to_process:$!";
foreach $file (readdir DH) {
print "one file in $dir_to_process is $file ";
}
closedir DH;


4,移出文件
unlink "slate","bedrock","lava";
unlink glob "*.o";


5,重命名文件
rename "old","new"


6,连接与文件
硬链接
link "chicken", "egg" or warn "can't link chicken to egg:$!";
软链接
symlink "dodgson", "carroll" or warn "can't symlink dodgson to carroll:$!";

要取得符号链接所指向的位置时,请使用readlink函数,它会返回符号连接所指向的位置,或在参数不时符号连接时返回undef;
my $where = readlink "carroll"; #得到"dodgson"

7,建立以及移出目录
mkdir "fred", 0755 or warn "cannot makde fred directory:$!";

oct函数会强制把字符串当成八进制处理,无论它是否以0开头
my ($name,$perm) = @ARGV;
mkdir $name, oct($perm) or die "cannot create $name:$!";

想要移出空目录时,可以使用rmdir函数。
rmdir $_ for glob "fred/*" #移出fred/下所有的空目录

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

如果目录不为空,则rmdir操作符会执行失败。你可以用unlink来删除目录的内容,再试着移出应该已经清空的目录

my $temp_dir = "/tmp/scratch_$$"; #由进程标识符决定。
mkdir $temp_dir,0700 or die "cannot create $temp_dir:$!";

unlink glob "$temp_dir/* $temp_dir/.*"; #删除$temp_dir的内容
rmdir $temp_dir;


7,修改权限
chmod 0755, "fred", "barney";

8,更改隶属关系
chown会同时更改拥有者和所属组,他们必须以数值形式的用户标识符已经组标识符来指定:
my $user = 1004;
my $group = 100;
chown $user,$group, glob "*.o";

如果处理的不是数值,而是名称,需要用getpwnam函数将名称转换成数值,再用相应的getgrnam将组名称转化成竖直就行了
defined (my $user = getpwnam "merlyn") or die "bad user ";
defined (my $group = getgrnam "users") or die "bad group ";
chown $user, $group, glob "/home/merlyn/*";

9,更改时间戳
如果你想修改某个文件最近的更改或访问时间以欺骗其他程序,可以使用utime函数来造假,它的前两个参数是新的访问时间和更改时间,后面接的事要修改的文件名列表,时间的格式采用的是内部的时间戳格式

"right now"是个很方便的时间戳值,time函数会以正确的格式返回这个值。所以,如果想修改当前目录下所有的文件,让他们看起来是在一天前修改的,却是在此刻被访问的,只要这么写就可以了:
my $now = time;
my $ag0 = $now - 24 * 60 * 60; #一天的秒数
utime $now, $ag0, glob "*";

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/312079/viewspace-245697/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2007-12-05

  • 博文量
    1854
  • 访问量
    2088481