Perl文件、目录常用操作

注意,这些操作的对象是文件名(相对路径/绝对路径),而非文件/目录句柄,句柄只是perl和文件系统中文件的关联通道,而非实体对象。

创建文件

在unix类操作系统中有一个touch命令可以非常方便的创建文件,还能批量创建一些名称规律的文件。但实际上touch的主要介绍中却是"修改文件时间戳",创建文件只不过是它的辅助能力。如果没有touch命令,如何在shell环境下创建文件?最佳方式是通过重定向的方式。

在perl中没有touch类似的功能,所以原始地只能通过open打开输出类的文件句柄和输出操作来创建文件(同时也可以写入数据)。

open FH,">>/tmp/cc.log";
print FH;       # 创建空文件
close FH;

如果想批量创建命名规范的文件,可以将创建操作放进循环中进行迭代。例如创建cc{1..10}.log这10个文件:

foreach (1..10){
    open FH,">cc${_}.log";
    print FH;
    close FH;
}

当然,perl可以通过system或反引号或exec来和shell进行交互。不过这样的效率毕竟一般,每次交互都fork进程并解析执行shell语句。例如:

`touch dd{1..10}.log`;

但是如果想要批量创建的文件不能用一个touch(或少数几个)来创建的话,还是建议采用perl的创建方式,因为每次和shell交互touch都fork一次perl进程并解析执行shell语句,文件数量多时,这样的效率很一般。不过毕竟不太可能用到这种情形。

删除文件

在unix系统里,使用rm删除文件/目录,但它内部调用的是unlink函数。

在perl中删除文件使用perl自带的unlink函数,它也会调用操作系统的unlink函数来删除文件。它可以接一个文件元素,也可以接一个列表,或者说它的参数上下文就是列表。

但是注意,unlink无法删除目录,要删除目录,见下文。

unlink @lotfiles;            # 删除数组中的文件
unlink 'cc.log';             # 删除单个文件
unlink 'cc1.log','cc2.log';  # 删除文件列表
unlink qw(cc3.log cc4.log);  # 删除文件列表
unlink glob dd*.log;         # 通配文件名删除

关于文件名通配详细内容,见后文。

需要注意,unlink有返回值,返回的是成功删除的文件数量。

所以,unlink删除3个文件时,如果它的返回值为3,表示全删除成功了,如果返回值为0表示一个都没删除,但如果返回的是1或者2,我们就无法判断哪些文件删除成功,哪些文件删除失败。这时需要在循环中一个一个文件地迭代删除操作,并给出错误提示。

`touch dd{1..10}.log`;
foreach (1..10){
    unlink "dd${_}.log"
        and ++$count       # 注意,++放在变量的前面
        or  warn "Can't remove file dd${_}.log: $!";
}
print "removed $count files\n";

注意上面的and语句中,自增++$count的自增符号放在变量的前面,如果放在后面,会因为初始化$count为0,$count++表达式返回的值为0(但$count加完后返回1)而执行or语句。也就是说,删除第一个文件dd1.log时也会报告警告信息。

创建目录

  • 创建目录可以使用mkdir,它会发起系统调用并返回布尔值:成功/失败,失败时会设置$!
  • mkdir时可以同时指定文件权限,权限需要指定4位的8进制。如果使用变量传递这个权限位,应当使用oct()函数保护它不被当作十进制数
  • mkdir不能递归创建目录(unix系统下mkdir -p的功能),可以使用File::Path里的make_path函数或mkpath函数,他们等价

例如,创建一个目录

mkdir "/tmp/test1";
mkdir;                # 等价于mkdir "$_"
mkdir "/tmp/test2",0755   # 权限不能加引号包围,它是8进制数值
    or die "Can't create directory: $!";

如果是使用变量传递权限位,应当使用oct()函数来保护它作为8进制数。

$perm="0755";
mkdir "/tmp/test3",oct($perm);

mkdir函数无法递归创建目录。也就是说,当要创建的目录的上级目录不存在时,mkdir函数将失败。如果想递归创建目录,可使用File::Path里的make_path函数或mkpath函数,他们是等价的。

这个函数的语法是:

make_path(dir1,dir2,...,{opts})

opts可以是以下几种:
mask  => NUM       # mask和mode是同义词,NUM指定八进制权限值,
mode  => NUM       # 这种方式指定权限值受umask影响,若目录已存在,则不修改

chmod => NUM       # 直接赋予一定权限值,不受umask影响,若目录已存在,则不修改

verbose => $bool   # 是否输出详细信息,默认啥也不输出

error => \$err     

owner => $owner    # 这3条都表示为创建的目录设置所有者,如果已存在,则不设置
user  => $user     # 可以使用username,也可以使用uid,但如果username无法
uid   => $uid      # 映射为uid,或者uid不存在,或者无权限的时候,将报错

group => $group   # 设置所属组,处理方式和上面所有者的处理方式一样
use File::Path qw(make_path);
make_path "/test/foo/bar";    # 一次性创建3级目录
make_path "/test/foo1/bar1",{
    chmod => 0777,
    verbose => 1
}

当然,和shell交互来创建目录也非常方便:

`mkdir -p /test/a/b/c`;

删除目录

  • 删除空目录用rmdir,且只能删除空目录
  • 要删除非空目录,可以使用File::Path里的rmtree函数或remove_tree函数,它们等价
  • 删除目录时,可随意对待尾随斜线问题,因为perl会自动删除尾随斜线,以满足多种平台对尾随斜线的定义标准

例如,删除一个目录

rmdir "/tmp/test";

因为rmdir无法删除非空目录,所以要删除非空目录,可以采用File::Path模块的rmtree函数。

rmtree的语法:

rmtree($dir1, $dir2,..., \%opt)

opts可以是以下几种:

verbose => $bool     # 是否显示删除信息,默认啥也不显示
safe    => $bool     # 删除时,跳过无法删除的对象。例如虚拟文件系统(VMS,如/proc)下有很多是无法删除的
keep_root => $bool   # 设置为真值时,保留顶级目录,也就是说自删除目录内的文件和子目录,顶级目录自身不删除
result => \$res
error => \$err
use File::Path qw(rmtree);
rmtree '/test/foo1',{verbose => 1};

由于perl无法向shell一样可以直接使用"*"通配,所以如果想删除目录内的文件和子目录,而保留foo1目录自身,应该设置keep_root选项,而不是用/test/foo1/*的方式来删除:

rmtree '/test/foo1',{verbose => 1,keep_root => 1};

实在想通配删除,可以使用glob来通配,关于通配,见后文:

rmtree((glob '/test/foo1/*'),{verbose => 1});

另一种保留目录自身的删除方式是遍历顶级目录,然后迭代删除遍历出来的每个子项:

foreach (</test/foo1/*>){
    -d $_ ? rmtree $_ : unlink $_;
}

图方便的话,直接和shell交互也非常方便。

`rm -rf /test/foo1/*`;

chdir切换目录

  • chdir用于切换到指定目录,如果不给参数,则回到家目录
  • chdir因为直接发起系统调用,所以报错时会设置$!
  • chdir不能使用shell里的~来表示家目录
chdir /tmp or die "Can't change dir to /tmp: $!";

修改权限

  • chmod函数修改文件、文件列表的权限值,它会直接发起系统调用,所以错误的话会设置$!
  • 只接受8进制的权限值,不允许使用rwx的权限字符
  • 它返回成功设置权限的数量

例如,设置目录、文件的权限:

chmod 0700,qw(/test/foo /test/foo1/a.log);
chmod 0700,'/test/foo','/test/foo1/a.log';

修改所有者、所属组

  • chown可以同时修改文件/目录、文件/目录列表的所有者、所属组,它会直接发起系统调用,所以报错时会设置$!
  • chown只接受uid和gid作为参数,不接受username和groupname
    • 但在unix上显示的时候,还是会显示为username和groupname,这是操作系统的映射机制
    • 可以使用getpwnam和getgrnam函数将username/groupname映射为uid/gid
  • 在uid或gid的参数位置上指定特殊值"-1",表示该位置的所有者或所属组属性保持不变
  • 它返回成功设置的文件数量
chown 1001,1001,glob '*.log';   # 第一个1001是user位,第二个1001是group位
chown -1,1002,'a.log';         # uid不变

如果想按照用户名、组名来设置,使用getpwnam和getgrnam函数:

defined(my $user = getpwnam 'longshuai') or die "bad user";
defined(my $group = getgrnam 'longshuai') or die 'bad group';

chown $user,$group,glob '*.log';

重命名文件/目录

文件名通配

文件查找:关于find2perl脚本

原文地址:https://www.cnblogs.com/f-ck-need-u/p/9601928.html

时间: 2024-10-08 20:00:30

Perl文件、目录常用操作的相关文章

SFTP上传下载文件、文件夹常用操作

SFTP上传下载文件.文件夹常用操作 1.查看上传下载目录lpwd 2.改变上传和下载的目录(例如D盘):lcd  d:/ 3.查看当前路径pwd 4.下载文件(例如我要将服务器上tomcat的日志文件取出来)进入你要下的文件所在的文件夹:cd /usr/apache-tomcat-6.0.39/logs/下载:get catalina.out 5.上传文件(例如我要上传一个文件到usr目录下)进入你想要上传文件的目录cd /usr上传文件put do.sh 6.上传下载文件夹格式:下载文件夹g

C#对文件/目录的操作:Path、File、Directory、FileStream、StreamWriter、StreamReader等类的浅析

一.Path:主要对文件路径的操作! 常用方法: String [email protected]"C:\a\b\c\123.txt"; 1-1.Path.GetFileName(path); //获得文件名:123.txt 1-2.Path.GetExtenSion(path); //获得后缀名:.txt 1-3.Path.GetFileNameWithoutExtension(path); //获得无后缀文件名:123 1-4.Path.GetDirectoryName(path)

Java File 类 文件的常用操作(递归遍历所有文件,统计文件大小,删除文件)

1 package com.beiwo.homework; 2 3 import java.io.File; 4 5 /* 6 4.将一个文件夹中所有的文件查找出来,按照一定的格式 7 分析 : 1.一个文件夹中存在文件,子文件夹 8 2.除了当前文件夹,还有子文件夹中的文件也需要找出来. 9 3.子文件查找文件和当前文件查找文件是一样的操作,就可以定义一个方法来做文件查找 10 11 3.删除一周前的数据 12 13 2.获取文件夹中所有文件的大小 14 15 1.判断是否有隐藏文件 16 1

os模块中关于文件/目录常用的函数使用方法

函数名 使用方法 getcwd() 返回当前工作目录 chdir(path) 改变工作目录 listdir(path='.') 列举指定目录中的文件名('.'表示当前目录,'..'表示上一级目录) mkdir(path) 创建单层目录,如该目录已存在抛出异常 makedirs(path) 递归创建多层目录,如该目录已存在抛出异常,注意:'E:\\a\\b'和'E:\\a\\c'并不会冲突 remove(path) 删除文件 rmdir(path) 删除单层目录,如该目录非空则抛出异常 remov

Python目录常用操作

os.path.basename(path) #取文件名 os.path.getsize(path) #取文件大小 os.path.exists(path) #文件是否存在 os.path.dirname(path) #取目录名 shutil.copyfile(source,dst) #拷贝文件到目标目录(支持深度拷贝)

Linux记录-lsof打开文件工具常用操作

lsof `which httpd` //那个进程在使用apache的可执行文件 lsof /etc/passwd //那个进程在占用/etc/passwd lsof /dev/hda6 //那个进程在占用hda6 lsof /dev/cdrom //那个进程在占用光驱 lsof -c sendmail //查看sendmail进程的文件使用情况 lsof -c courier -u ^zahn //显示出那些文件被以courier打头的进程打开,但是并不属于用户zahn lsof -p 302

vim编辑器常用操作

vim文件编辑器常用操作总结: 复制 yy 复制一行 10yy 复制从当前光标所在行到下面的10行 y1G 复制光标所在行至第一行的所有数据 yG  复制光标所在行至最后一行的所有数据 粘贴 p(小写) 粘贴到光标所在行的下一行 P(大写)粘贴到光标所在行的上一行 删除行 dd 删除光标所在的行 10dd 删除光标所在的行到下面10行 删除字符 x(小写) 删除光标所在位置后面的一个字符 x(大写) 删除光标所在位置前面的一个字符 合并行 J(大写) 将当前光标所在行合并到下一行 光标跳转 gg

文件及目录相关操作

PHP创建文件(夹)以及目录操作 一.目录操作         首先是从目录读取的函数,opendir(),readdir(),closedir(),使用的时候是先打开文件句柄,而后迭代列出: <?php$base_dir="filelist/"; //打开目录 $fso=opendir($base_dir);echo  $base_dir."<hr/>";while($flist=readdir($fso)){//文件列表 echo $flist

git bash 常用操作文件命令

git bash常用操作文件命令 在Windows下使用Git Bash,用的是Linux命令,常用几个文件操作命令如下: Windows命令 Linux 命令 意义 Windows命令 Linux 命令 意义 cd e:\xxx cd /e/xxx 切换到xxx目录 cd pwd 显示当前目录路径 dir ls 列出当前目录内容 copy nul xxx.txt touch xxx.txt 生成名为xxx.txt的空文件 del xxx.txt rm xxx.txt 删除xxx.txt文件 m