Perl-目录操作

上一篇 / 下一篇  2015-01-12 08:04:05 / 个人分类:Perl

在目录树中移动
程序在运行时会以自己的工作目录作为相对路径的起点。
可以使用chdir操作来改变当前的工作目录,和Unix Shell的cd命令差不多
chdir /etc
chdir是一个对操作系统的调用,苏一发生错误时便会设定标量变量$!的值,如果chdir的值返回为假,则表示有些事情没有顺利完成,应该检查一些$!中的错误原因。
由Perl程序启动的所有进程都回继承Perl程序的工作目录,可以目录的更改却无法影响调用Perl程序的
进程比如shell.这并不是Perl的限制,而是Unix,Windows和其他一些操作系统的一个特性,这意味着你
没有办法写出可以代替shell里的cd命令的Perl程序,因为一旦推出Perl程序,又会回到启动Perl程序时所在的目录的工作目录。如果调用chdir时不加参数,会回到用户主目录,并试着将工作目录设成主目录。
文件名通配
一般来说,shell会将命令行里的文件名模式展开成所有匹配的文件名,称为文件名匹配。
例如*.pm, 
有时候在程序内部也可能需要*.pm之类的模式,可以用glob操作符
glob '*'; 会取得当前目录中的所有文件并按字母顺序排序,但不包括以点号开头的文件。
glob '*.pm'; 取得当前目录中所有以.pm结尾的文件。
任何能够在命令行上键入的模式都可以作为唯一的参数交给glob来处理,如果要一次匹配多种模式,可
以在参数中用空格隔开各个模式
glob '.* *';
.*参数可以取得所有的文件名,无论它们是否以点号开始,两个条目之间的空格是有意义的,它分隔了
两个要进行文件名通配处理的条目。
文件名通配的另一种写法
<*> 用尖括号语法 Perl会把尖括号内出现的变量替换成它的值,类似于双引号内字符串的变量内插,这
表示在进行文件名通配之前,尖括号内的Perl变量会先被展开成它们的值。
尖括号既表示从文件句柄读取又代表文件名通配操作,如果尖括号内是满足Perl标识符条件的,就作为文件句柄来读取,否则他表示的是文件名通配操作。
当尖括号内仅是一个简单的标量变量(不是哈希或数组元素)时,那么它就是间接文件句柄读取,其中变量的值就是待读取的文件句柄名称。
Perl在编译阶段决定它是文件名通配符还是从文件句柄读取,和变量的内容无关。 
目录句柄
目录句柄开起来像文件句柄,使用起来也没有多大区别。你可以打开它(opendir),读取它的内容
(readdir),然后将它关闭(closedir),只不过读到的是目录里的文件名(或其他东西的名称 ),而不是文件
的内容。和文件句柄一样,目录句柄会在程序结束时自动关闭,也会在用这个句柄再打开另一个目录前自动关闭.
目录句柄返回的名称列表并未按照任何特定的顺序排序,列表中将会包含所有的文件,而不只是匹配某
些模式的部分。
readdir操作符返回的文件名并不包含路径名,它们只是目录里的文件名而已。 所以得加上路径名称才有办法得到文件的全名。
若是没有接上路径,文件测试操作符会在当前目录下查找文件,而不是在$dirname指定的目录下。
递归访问目录
可以使用File::Find模块来完成目录的递归处理
文件和目录的操作
删除文件
在Perl里面,使用unlink操作符,并指定要删除的文件列表
unlink 'a','b','c';
unlink的参数是一个列表,glob函数又返回的是一个列表,可以联合两者,一次性删除多个文件
unlink glob '*.pm'
unlink的返回值代表成功删除的文件数目,0代表一个都没有删,大于0,代表至少删除一个成功。
unlink执行失败时,内置的$!变量会被设成操作系统错误的相关信息,此变量只有在循环处理每一个文件的过程中才可用,因此每次系统调用失败时都会重设该变量的内容。
unlink不能用来删除目录,。
在Unix上,某个文件你无法读取,写入,执行,拥有,但是你可以删除它,因为删除文件的权限跟文件
本身的权限位无关,它取决于文件所在的目录的权限位。
重命名文件
rename函数 rename 'old', 'new';
可以将文件移到其他目录中 rename '/etc/old','new';
也可以用胖箭头,rename '/etc/old'=>'new';
只要运行程序的用户拥有足够的权限,可以将文件从其他目录移到当前目录
和大部分调用操作系统功能的函数一样,rename执行失败时返回假,并将操作系统返回的错误信息保存在$!中。 rename虽然可以将文件移到别的目录中,但是来源和目的地必须在同一个文件系统(挂载卷)上。
链接(hard link)与文件
挂载券指的是硬盘或相似设备。其中可能含有任意数目的文件和目录,每个文件都存储在编号的innode对应的位置中,不过,寻找某个特定的文件时,我们得从它的目录找起。
目录是一种由操作系统管理的特殊文件。基本上目录是一份文件名和相应的inode编号的对照表
目录列出来的内容一定会有两个特殊条目,一个是.(点),代表目录本身,另一个是..(点点),指的是目录结构中高一层的目录(也就是它的上层目录)要在指定目录中创建一个新文件时,系统会新增一个条目来记录文件名与新的inode编号。每个inode都有自己的链接数。如果inode并未出现在任何目录中,它的链接数一定是零。所有链接数为零的inode都可以用来存放新的文件。每当inode被列入目录中,链接数就会递增,当它在目录的列表里被删除时,链接数就会递减。任何目录的链接数都至少是2,一个位于他的上层目录的列表里,另一个位于它本身的列表里。如果目录有子目录,则每个子目录还会通过..(点点)再增加一个链接,目录的链接数一定等于子目录数量加上2.链接数代表的是inode真是名称的数量。 可以通过对文件建链接的方式,将两个文件名指向同一个文件存储。link 'filename','another file name'关于目录列表里的链接还有一条规定,就是在目录列表中所有的inode指向的文件都必须在同一个挂载券中。即使将物理介质移到另一个机器上,其中的目录和文件的链接仍然有效。如果要跨磁盘移动文件,就必须重新部署inode的数据。链接的另一个限制就是不能为目录建立额外的名称,这是因为目录必须按照层次排列。因此,不能增加目录的链接数,也不能跨挂载券链接。
符号链接(symbolic link, soft link)
符号链接也叫软链接,是目录里的一种特殊条目,用来告诉系统实际文件放置在别的地方。
符号链接和硬链接不同,它可以跨文件系统为目录建立软链接,(也就是一个新的目录名),事实上,
符号链接能指向任何文件名,而不管它放在哪个目录里。甚至还可以指向不存在的文件。软链接不像硬
链接那样可以防止数据丢失。因为它不会增加inode的个数。
软链接可以指向目前还不存在的文件,所以在创建文件时很有用。软链接目录下创建的文件,真实的位
置在原文件目录下。 要取得符号链接指向的位置,可以使用readlink函数,它会返回富豪链接指向的位置。如果参数不是符号链接,则返回undef.软链接和硬链接都可以用unlink移除,unlink只是从目录里移除该文件名的链接条目,并将他的链接数递减,必要时再释放inode.
创建和删除目录
mkdir 创建目录,返回真表示创建成功,失败时会设定$!的值。
rmdir 移除空目录,和unlink很像,不过每次调用只能删除一个目录 
对非空目录调用rmdir函数会导致失败,可以先用unlink删除目录中的内容,再试着移除已经清空的目录 
修改权限
chmod 可以用来修改文件和目录的权限。chmod会返回成功更改的条目数量,哪怕只有一个参数,它也会
在失败时将$!设成合理的错误信息。 Perl下的chmod不能接受符号修改参数,只能用数字。
修改隶属关系
chown 修改一些列文件的拥有者以及其所属组。拥有者和所属组会被同时修改,并且在指定时必须给出
数字形式的用户标识符及组标识符。如果处理的不是数字,而是字符串,可以用getpwnam函数将用户转换成用户编号,getgrnam函数把用户组名转换成组编号.hown函数会返回受影响的文件数量,在错误发生时会在$!中设定出错的信息。
修改时间戳
utime 修改某个文件的最近的更改或访问时间。它的前两个参数是新的访问时间和更改时间。其余参数就是要修改时间戳的文件名列表。时间格式采用的是内部时间戳的格式。time函数可以返回当前的时间
当文件有任何更改时,ctime的值一定会被设为now. utime函数没办法修改ctime. ctime主要是用来给增量备份程序用的。


TAG:

 

评分:0

我来说两句

Open Toolbar