`

Perl 中的unlink,link,symlink等,处理文件和目录(转)

    博客分类:
  • Perl
阅读更多

删除文件 
 perl 中用 unlink 操作符删除文件,同 shell  rm 命令一样。 
unlink "aa","bb","cc";       
把这三个文件删除。 

 glob 函数结合起来可以一次删除多个文件 
unlink glob "*.o";   
删除当前目录下以 .o 结尾的文件,与 rm *.o 相似。 

unlink 
的返回值告诉我们 有多少文件被成功删除。 
my $successful = unlink "aa","bb","cc";
print "I delete $successful   file(s) just now.\n";

如果想知道那个文件被删除,可用循环,一次删除一个文件。 
foreach my $file (qw/aa,bb,cc/) {
   unlink $file or warn "failed on $file:$!";
   }

一个很少人知道的有关 unix 的事实。如果你有一个文件,你对它不能读,不能写,不能执 行,甚至文件可能并不属于你,但你仍然可以删除它。这是因为 unlink 一个文件的权限不依赖于文件本身的权限位,起作用的其实是包含这个文件的目录的权限位。只要目录是可写的,就可以删除该目录中不属于 自已的文件。在 unix 中可以通过设置 sticky bit 解这个问题,以保护可写目录。 

重命名文件 
rename "old","new";
类似于 mv 命令。 rename 失败时返回假,并在 $! 中设置操作系统的错误信息。因此可用 or die  or warn 显示给用户。 

一个把所有以 .old 结尾的东西 rename 为以 .new 结尾的 perl 程序。 
foreach my $file (glob "*.old") {
   my $newfile = $file;
   $newfile =~ s/\.old$/.new/;   
由于 .new 不是模式,所以点号不用加反斜 杠。 
   if (-e $newfile) {
       warn "can't rename $file to $newfile:$newfile exists.\n";
   } elsif ( rename $file, $newfile) {
       } else {
           warn "rename $file to $newfile failed:$!\n";
       }
   }

链接和文件 
每个文件都被存在一个编了号的 inode 中,每个 inode 都包含一个称为链接计数( link count )的数字,当 inode 没有列在任何目录中时,链接计 数总是 0 ,也就是空,可以分配给文件。当 inode 被加到一个目录中时,链接计数会递增;如果此列表项被删除,链接计数会递减。目录包含 . ,也就是指向自已的 inode ,所以目录的链接计数应该总是 至少为 2 。文件也可以不止一个列表项,如链接文件。在 perl中用 link "aa","bb" 建立一个指向 aa 的链接 bb 。类似于在 unix shell 一执行 "ln aa bb" 。现在 aa,bb 都有相同的 inode 值,两个文件有相同的大小,相同的内容。在 aa 中加入一行,也会在 bb 中加入一行。如果意外删除了 aa ,数据并不会丢失,可以在 bb 中找回来。反之也一样。但如果两个文件都删除了,则数据就会丢失。 

目录列表项中的链接规则 
1 
 一个给定的目录列表项中的 inode 号都指向同一个安装卷上的 inode 。这条规则保证,如果物理媒介 被移到了另一台机器上,所有的目录仍和它们的文件呆在一起。这就是为什么可用 rename 把文件从一个目录移到另一个目录的原因,但两个目录必须在同一个 文件系统(安装卷)中链接不能用于目录。 
2 
、不能给目录起新的名字。因 此目录不能用于链接。 
以上讨论的是硬链接,还有一个符号链接,也叫软链接,能绕过这硬连接的限制。 
symlink "aa","bb";
   or warn "cannot symlink aa to bb:$!";
这和 unix shell 中的 "ln -s aa bb" 类似。 

要想知道符号链接指向哪里,可以使用 readlin 函数。如果不是符号链接,则返回 undef  

两种链接都要以用 unlink 删除。 

建立和删除目录 
mkdir 
函数可以在一个已有 的目录中建立一个目录。返回真时表示成功。 
mkdir "aaa",0755 or warn "cannot make aaa directory:$!";
第二个参数是新生成目录的权限位。以 0 开头,这个是一个八进制值。 

oct 
函数强制对一个字符串按 八进制解释,不论前面有没有 0  

删除空目录,可用 rmdir 函数。 
rmdir glob "aa/*";   
删除 aa/ 下所有空目录。 

rmdir 
操作符对非空目录操 作会失败。所以要先用 unlink 删除文件,再删除目录。 

修改权限 
perl 
中有一个 chmod 函数,和 unix shell 中的 chmod 完成类似功能。 
chmod 0755, "aa","bb";
perl
 
中不接受符号权限表达式方式,如 +x,go=u-w 等。 

改变所有者 
chown 
函数可以改变一组文 件的所有者和属组。 
chown 1004,100,glob "*.o";
可用 getpwnam 把用户名翻译成一个数字,用 getgrnam 函数把组名翻译成一个数字。 

改变时间戳 
utime 
函数可修改文件的访 问时间和修改时间。 
my $now = time;
my $ago = $now -24*60*60;   
每天的秒数 
utime $now,$ago,glob "*";   
把访问时间设为现在,修改时间设为一天以前 

第三个时间 ctime 的值在对文件做任何改变时,总被设为  现在  ,因此没办法用 utime 函数来设置它。因为在你设置完后它会立即被重置为“现在”,这是因为它的主要目的就是进行增量备份:如果文件的 ctime 比备份磁带上的日期要新,就说 明又需要备份了。 

使用简单的模块 
File::Basename 
模 块    从文件名中抽取基名,取不包括路径的文件名。 
通过 use 命令声明一个模块 
use File::Basename;
这样,我们就有了一个 basename 函数。 
my $name = "/usr/local/bin/perl";
my $basename = basename $name;   
得到 perl
该函数可用于多平台,如 windows  

该模块中还有一个 dirname 函数,它把目录名从一个完整文件名中分离出来。 

有选择地使用模块中的函数 
当你不需要模块中的所有函数,或模块中的函数和你程序中子例程有冲突时,你可以在声明模块时给模块一个引入 列表,只包括需要的函数。 
use File::Basename qw /basename/;   
只要 basename 函数,不要其它函数。 
use File::Basename qw //;       
不要任何函数。 
怎么会想要一个空列表呢?这是因为,有引入只是使得我们能使用短的简单的函数名, basename,dirname 。即使 不引入这些名字,我们仍可以使用,只是在没有引入时,我们要用全名来调用它,如: File::Basename::dirname  
每个模块都有缺省的引入列表,查相关文档有介绍。 

File::Spec 
模块 
用来处理文件规范 (file specification) 。它是一个 OO 的模块。用小箭头而不是 :: 来引用函数。 $newname = File::Spec->catfile($dirname,$basename);

分享到:
评论

相关推荐

    unlink命令 删除指定文件

    unlink命令用于系统调用函数unlink去删除指定的文件。和rm命令作用一样 ,都是删除文件。 语法格式:unlink [参数] 常用参数: –help 显示帮助 –version 显示版本号 参考实例 删除test文件: [root@...

    UNIX环境高级编程(第四章)

    4.15 link, unlink, remove和rename 函数 71 4.16 符号连接 73 4.17 symlink 和readlink函数 76 4.18 文件的时间 76 4.19 utime函数 78 4.20 mkdir和rmdir函数 79 4.21 读目录 80 4.22 chdir, fchdir和getcwd函数 ...

    liqingqiya#blog#linux关于文件和目录的函数1

    3. unlink, link, symlink系统调用 5. chdir系统调用和getcwd函数 1. opendir函数 2. readdir函数 3.

    perl脚本(压缩文件夹下文件)上传服务器

    利用perl写一脚本压缩本地文件夹上传到服务器,具体, #!/usr/bin/perl -w use Archive::Zip qw( :ERROR_CODES :CONSTANTS ); use File::Path; use File::Copy; my $zip = Archive::Zip->new(); use strict; my ( $...

    PHP unlink与rmdir删除目录及目录下所有文件实例代码

    在php中删除文件与目录其实很简单只要两个函数一个是unlink一个rmdir函数,如果要实现删除目录及目录下的文件我们需要利用递归来操作. 函数代码:仅删除指定目录下的文件,不删除目录文件夹,代码如下: class shanchu {...

    Nu-Link仿真器驱动(新唐Nuvoton)安装文件

    Nu-Link 驱动安装(Nuvoton)

    Linux unlink函数和删除文件的操作方法

      对于硬链接来说,unlink 用来删除目录项,并把 inode 引用计数减 1,这两步也是一个原子过程。直到 inode 引用计数为 0,才会真正删除文件。   对于软链接来说,unlink 直接删除软链接,而不影响软链接指向的...

    perl函数手册(英文版)

    文件:binmode, chdir, chmod, chown, chroot, close, eof, fnctl, fileno, flock, getc, glob, ioctl, link, lstat, open, print, printf, read, readdir, readlink, rename, rmdir, seek, select, stat, symlink, ...

    php中unlink()、mkdir()、rmdir()等方法的使用介绍

    unlink()函数删除文件 、mkdir()函数创建目录、rmdir()函数删除目录这些方法在文件相关的处理方法会经常使用到,本文整理了一些,需要的朋友可以了解下

    linuxc 高级编程之文件操作(带截图)

    //1.创建文件file1,写入字符串“abcdefghijklmn”;...1.递归遍历/home目录,打印出所有文件和子目录名称及节点号。 ?2.判断文件类型,如果是子目录,继续进行递归遍历,直到遍历完所有子目录为止

    堆漏洞之unlink1

    unlink 漏洞利用技巧的核心就在下面这几行代码:SP00F|版权属于我个人所有,你可以用于学习,但不可以用于商业目的漏洞利用的技巧就是覆盖相邻(下一个或下下

    unlink-empty-files:给定一个目录,取消链接(删除)所有长度为 0 的文件

    给定一个目录,取消链接(删除)所有长度为 0 的文件安装 npm install unlink-empty-files执照版权所有 (c) 2014 David Björklund 该软件是在 MIT 许可下发布的: 特此授予任何人免费获得本软件副本和相关文档文件...

    link-command:“createLink”和“unlink”本机命令打包为命令

    链接命令 “createLink”和“unlink”本机命令打包为命令 安装 $ npm install link-command

    UNIX环境高级编程_第二版中文

    4.15 link、unlink、remove和rename函数  4.16 符号链接  4.17 symlink和readlink函数  4.18 文件的时间  4.19 utime函数  4.20 mkdir和rmdir函数  4.21 读目录  4.22 chdir、fchdir和getcwd函数  ...

    coreutils-8.32.tar.gz

    去掉文件名中的目录和后缀 cat 把文本文件的内容发送到标准输出 chgrp 改变文件和目录属组,属组可以使用组名或者组识别号表示 chmod 改变文件和目录的权限,权限可以使用符号或者八进制两种表达方式 chown ...

    UNIX环境高级编程部分

    4.15 link, unlink, remove和 rename 函数 4.16 符号连接 4.17 symlink 和readlink函数 4.18 文件的时间 4.19 utime函数 4.20 mkdir和 rmdir函数 4.21 读目录 4.22 chdir, fchdir和 getcwd函数 4.23 特殊设备文件 ...

    STM32 实现FAT文件系统

    STM32实现的U盘fat文件系统读写,已经验证没有任何问题。

    UNIX环境高级编程

    4.15 link, unlink, remove和 rename 函数 4.16 符号连接 4.17 symlink 和readlink函数 4.18 文件的时间 4.19 utime函数 4.20 mkdir和 rmdir函数 4.21 读目录 4.22 chdir, fchdir和 getcwd函数 4.23 特殊设备文件 ...

Global site tag (gtag.js) - Google Analytics