第十二章 目录操作
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 = ;
如果尖括号之间是一个严格意义的标示符,则为从文件句柄读入;否则,为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 () {
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 () {
print "remove file $_\n";
unlink "$_";
}
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/11903161/viewspace-689535/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/11903161/viewspace-689535/