Perl中的文件测试操作符

文件操作

Posted by dulunar on September 20, 2019 | 访问量:

内置函数文件操作

Perl中可以通过两个内置函数stat(),lstat()计算文件大小;

my @stat = stat "/path/of/the/file/filename";

lstat()、stat()会返回一个13个元素的数组,每个元素有各自的含义:

  1. dev :文件所属文件系统的设备ID
  2. inode :文件inode号码
  3. mode :文件类型和文件权限(两者都是数值表示)
  4. nlink :文件硬链接数
  5. uid :文件所有者的uid
  6. gid :文件所属组的gid
  7. rdev :文件的设备ID(只对特殊文件有效,即设备文件)
  8. size :文件大小,单位字节
  9. atime :文件最后一次访问的时间戳(从1970-01-01开始计算的秒数)
  10. mtime :文件最后一次修改的时间戳(同上)
  11. ctime :文件创建的时间戳(同上)
  12. blksize :文件所属文件系统的磁盘块大小
  13. blocks :文件占用block数量(一般是512字节的块大小,可通过unix的stat -c “%B”获取块的字节)

这里需要注意,给出的时间是一个数字,需要转换;

my $atime = (lstat "/home/luna/LunaDisk/refine-master/AnnoPipeline.V1.pl")[8];
print "$atime\n";
##输出是:   1568920688
my $trantime = localtime $atime;
print "$trantime\n";
##输出是:  Thu Sep 19 21:18:08 2019

UPDATE: 2019-10-30 这两个函数:lstat 和 stat,对于生信有一定的帮助,就是在copy文件的时候,尤其是bam文件及其index文件时,我们一定要先比较两个文件的最后修改时间,如果index的时间比bam文件早,一般是不建议copy过去直接使用的:

my $bamt = lstat($bam)->mtime
my $bait = lstat($bai)->mtime
next unless($bait >= $bamt);

Perl中的文件测试操作符

文件大小测试符:
-e			#文件或者目录存在
-z			#文件是否存在且为空(对目录而言,永远为假)
-s			#文件是否存在且不为空,返回值是文件大小,单位为字节
文件类型测试符
-f			#文件是否为普通文件
-d			#文件是否为目录文件
-l			#文件是否为软链接(字符链接)
-b			#文件是否为块设备
-c			#文件是否是字符设备文件
-p			#文件是否为命名管道
-S			#文件是否为socket文件
权限类测试符

首先区分一下

Real uid:文件调用者的uid

Effective uid:文件调用最后生效的uid

-r			#文件或目录(对effective uid)是否可读
-w			#文件或目录(对effective uid)是否可写
-x			#文件或目录(对effective uid)是否可执行
-o			#文件或目录(对effective uid)的所有者

-R			#文件或目录(对real uid)是否可读
-W			#文件或目录(对real uid)是否可写
-X			#文件或目录(对real uid)是否可执行
-O			#文件或目录(对real uid)的所有者

-u			#文件或目录是否设置了setuid (setuid只对可执行普通文件有效)
-g			#文件或目录是否设置了setgid (setgid只对普通文件或目录有效)
-k			#文件或目录是否设置了sticky (sticky属性只对目录有效)
其它测试符
-M			#最后一次修改(mtime)距离目前的天数,修改的年龄
-A			#最后一次访问(atime)距离目前的天数,访问的年龄
-C			#最后一次inode修改(ctime)距离目前的天数
-M/-A/-C	#会计算天数,它是(小时数/24)来计算的。例如,6小时前修改的文件,它的天数就是0.25天。

-T			#文件看起来像文本文件
-B			#文件看起来像二进制文件
-t			#文件句柄是否为TTY设备(该测试只对文件句柄有效)

References

Perl文件测试操作和stat函数

Perl文件测试

						—— dulunar 后记于 2019.09