ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Perl 小骆驼 12章笔记 目录操作

Perl 小骆驼 12章笔记 目录操作

原创 Linux操作系统 作者:zhaojienju 时间:2011-03-15 17:59:00 0 删除 编辑

第十二章 目录操作

chdir 改变工作目录
chidir "/etc" or die "cannot chdir to /etc:$!";
没有参数时,将用户的主目录作为当前目录。

glob操作:展开文件列表
my @all_files = glob "*"; 得到当前目录所有文件
my @pm_files = glob "*.pm";
my @all_files_including_dot = glob ".* *";

glob的替换语法
my @all_files = <*>;
my $dir = "/etc";
my @dir_files = <$dir/* $dir/.*>;

如果尖括号之间是一个严格意义的标示符,则为从文件句柄读入;否则,为globbing操作。
my @files = ;  glob
my @lines = ;  文件句柄

如果需要,可以使用readline来读文件句柄:
my @lines = readline FRED;
----------------------------------------

目录句柄:从给定目录得到其文件名列表
opendir readdir closedir

my $dir_to_process = "/etc";
opendir DH, $dir_to_process or die "cannot open $dir_to_process: $!";
foreach $file(readdir DH) {
  print "one file in $dir_to_process is $file\n";
}
closedir DH;
和glob不同的是,返回所有文件,没有排序。
注意:readdir返回的文件名没有路径名部分


比如这个例子:
foreach (<@ARGV>) {
  print "$_\n";
}
或者foreach (@ARGV)

结果:./test5 /u05/workarea/alice/*
/u05/workarea/alice/genTar
/u05/workarea/alice/name
/u05/workarea/alice/test
/u05/workarea/alice/test2
/u05/workarea/alice/test3
/u05/workarea/alice/test4
/u05/workarea/alice/test5

或者: ./test5 *
genTar
name
test
test2
test3
test4
test5

 

如果换成opendir:

my $dir="/u05/workarea/alice";
opendir DH, $dir or die "cannot open $!";
foreach (readdir DH) {
  print "$_\n";
}
closedir DH;
打印结果:
./test5
.
..
genTar
test
test2
test3
test4
test5
name

主要在做文件检测的时候,需要加上路径名。

----------------------------------------
递归的目录列表
可以使用FIND::FIND库

----------------------------------------
删除文件
unlink "slate", "bedrock", "lava";unlink glob "*.o";

unlink返回值是成功删除的文件数。

foreach my $file(qw(slate bedrock lava)) {
  unlink $file or warn "failed on $file: $!\n";
}

重命名
rename "old", "new";

-------------------------------
硬连接个数
一般出现在ls -l 权县位的右边。

sdd01a_eda 319 : ls -lia
total 26
     67127 drwxr-xr-x   3 eda      oinstall     512 Mar 15 09:01 .
     13028 drwxrwxrwx  34 root     root        1536 Mar 10 09:31 ..
     67128 drwxr-xr-x   3 eda      oinstall     512 Jan  7 02:33 genTar
     67065 -rw-r--r--   1 eda      oinstall     180 Mar 10 09:15 name
     67036 -rwxrwxrwx   1 eda      oinstall     405 Mar  7 05:48 test
     67047 -rwxrwxrwx   1 eda      oinstall     498 Mar  7 05:56 test2
     67055 -rwxrwxrwx   1 eda      oinstall      54 Mar  7 06:50 test3
     67056 -rwxrwxrwx   1 eda      oinstall      63 Mar  7 07:12 test4
     67103 lrwxrwxrwx   1 eda      oinstall       5 Mar 15 09:01 test4link -> test4
     67057 -rwxrwxrwx   2 eda      oinstall      52 Mar 15 06:56 test5
     67102 lrwxrwxrwx   1 eda      oinstall       5 Mar 15 08:56 test5link -> test5
     67057 -rwxrwxrwx   2 eda      oinstall      52 Mar 15 06:56 tset5hlink
普通文件通常为1。建立symbol link不会增加连接数,比如test4, test4link。建立hard link会增加,比如

test5, test5hlink.目录的连接数为2+包含的子目录个数.

同样可以看到,test5和test5link的inode是不同的,但test5和test5hlink的inode相同!也就是说它们使用同一

个inode.
perl中建立连接命令:link
link "chicken", "egg";

hard link和原文件指向磁盘中的同一块地方.如果不小心删除一个,数据也不会丢失.

软连接:symlink "dodgson", "carroll"
符号连接告诉系统,如果查找carroll,现在应当离开,而去找dodgson.

符号连接可以跨越不同的文件系统,可以给目录新的名字,而硬连接做不到.但也不能像硬连接一样防止文件丢失.

 

unlink删除任意类型的连接。删除目录中给定文件名的实体,符号连接减1。

创建和删除目录

mkdir "fred", 0755 or warn "cannot make dir fred: $!";

或者
my $name = "fred";
my $permission = "0755";
mkdir $name, oct($permission); 按照八进制解释该字符串

删除目录: rmdir glob "fred/*";
rmdir只能删除空目录。所以要先删除下面的文件
unlink glob "$tmp_dir/* $temp_dir/.";
rmdir $tmp_dir;

-----------------------
chmod 改变文件或目录的权限
chmod 0755, "fred", "barney";
-----------------------
改变所有者
chown

my $user = 1004;
my $group = 100;
chown $user, $group, glob "*.o";
只有用户名和组名的时候,需要:
defined(my $user = getpwnam "merlyn") or die "bad user";
defined(my $group = getprnam "users") or die "bad group";
chown $user, $group, glob "/home/Merlyn/*";
-----------------------
改变时间戳utime
前两个参数是最近访问时间,和修改时间 。

my $now = time;
my $ago = $now - 24*60*60;
utime $now, $ago, glob "*";


习题:

1。??怎样获得$HOME变量?写死?

$dirname = $ARGV[0];
if ($dirname =~ /\s/ ) {
  $dirname = $HOME;
}

chdir $dirname or die "cannot chdir to '$dirname':$!";

my @all_files = glob "* .*";
foreach (@all_files) { print "$_\n";}

 

2。
my @all_files = glob "* .*";


3。

opendir DH, $dirname or die "cannot open $dirname: $!";
foreach $file(readdir DH) {
  if ($file =~ /^\./) {next;}
else {print "$file\n";}
}

4。

foreach (<@ARGV>) {
  print "remove file $_\n";
  unlink "$_";
}

 

 

 

 


 

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

下一篇: linux 知识要点
请登录后发表评论 登录
全部评论

注册时间:2010-10-05

  • 博文量
    80
  • 访问量
    192599