在目录书中移动

chdir 操作副改变当前的工作目录。它和shell中cd命令类似:

chdir ‘/etc’ or die “cannot chdir to /etc:$1”;

注意:工作目录不能更改的,也就是说Perl程序返回后一定会回到所在的工作目录。

如果调用chdir时不加参数,Perl会猜想是想要回到用户主目录,并将工作目录设成主目录,这和shell下使用不加参数的cd命令效果相同。

注意:可不能使用波浪符~。

文件名通配

形如:echo *.pm;其中通配符是*。在Perl中同样适用:

my @all_files=glob ‘*’;

My @pm_files=glob ‘*.pm’;

其中,@all_files取得当前目录中的所有文件并且按照字母顺序排序,但不包括以点号开头的文件,这和shell中的做法完全相同(ls)。

如果需要一次匹配多种模式,可以在参数中用空格隔开各个模式:

my all_files_including_dot=glob '*.gz *.pl';

文件通配的另一种语法

使用<>完成glob的功能,如:

my @all_files=<*>;#效果等同于: my @all_files=glob “*”;

Perl会把尖括号<>内出现的变量替换为他的值,类似与双引号内字符串的变量内插。

my $dir='/etc';

my @dir_files=<$dir/* $dir/.*>;

假如尖括号即表示从文件句柄中读取有代表文件名通配操作,那Perl如何取舍?

因为合理的文件句柄必须是严格意义上的Perl标识符,所以如果尖括号内满足Perl标识符条件的,就作为文件句柄来读取;否则就代表文件名通配符。如:

上述规则唯一例外就是当尖括号内仅仅是一个简单的标量变量时,那么他就是间接文件句柄读取,其中变量的值就是带读取的文件句柄名称。

目录句柄

opendir(代替open) 打开目录句柄;

readdir (代替readline)读取目录句柄的内容;

closedir(代替close) 关闭目录句柄;

对比:

#!/usr/bin/env perl
use 5.010;
open AA,'<','aa';
while(){
my $line=readline AA;
if($line eq "")
{
last;#不知道为什么,用break出现了错误。
}
print "$line";
}
close AA;

目录句柄的缺点:目录句柄返回的名称列表并未按照特定的顺序排列。同时列表中将包含所有文件,而不是匹配某些模式的部分(如:*.pm)。同时列表中包含了名称一点号开头的文件,.和..也在其中。所以如果我们只想处理名称以pm结尾的文件,则可以在玄幻内使用一个跳过函数:

while($name=readdir $dh){

    next unless $name=~ /\.pm$/; #处理名称以pm结尾的文件

    next if $name =~ /^\./;#去掉以点号开头的文件

    .....其他对文件名的处理......

}

因为readdir操作符返回的只是文件名并不包含路径名,所以他们只是目录里的文件名而已。

而有时候为了更加方便操作,也是更加清晰,使用下面的操作:

递归访问目录(主要为了实现shell中的find命令操作)

使用File::find模块。

使用File::Find::Rule和File::Finder操作具有更好的用户界面和可操作姓。

File::Find::Rule==>http://search.cpan.org/~rclamp/File-Find-Rule-0.33/lib/File/Find/Rule.pm;

如:

#!/usr/bin/env perl
use 5.010;
use File::Find::Rule;
#say "INC==@INC";
@DIR=qw (/home/lukexwang/PerlDemo);
use lib '.';
my @files=File::Find::Rule->file()
->name( '*.pl' )
->in(@DIR);
say "@files";

文件和目录的操作

删除文件:unlink

unlink 'slate','bedrock','lava';

unlink qw(slate bedrock lava);

联合glob函数和unlink函数:

unlink glob '*.o';==rm *.o;

unlink的返回值代表成功删除的文件数目。

只知道数目并不知道具体是删除了哪一个,如果一定要知道是删除了哪一个可以递归删除,如下面的语句:

这个命令只能删除文件,不能删除目录(rmdir).

重命名文件

rename 'old','new';====>shell中的mv 命令

既然和mv类似,那当然可以将文件移动到其他的目录下:

很多人喜欢用胖箭头:

新闻组中最常见的就是以.old结尾的文件改名为.new结尾。下面是代码:

链接和文件

硬链接:link 'chicken','egg' or warn "can't link chicken to egg:$!";#为egg创建连接chicken

软链接:symlink 'dodgson','carroll' or warn "can't symlink dodgson to carroll:$!";

要取得软链接指向的位置,使用readlink函数。他会指向软连接的位置,如果参数不是符号连接,则返回undef;

创建和删除目录

mkdir 'fred',0755 or warn "Cannot make fred directory:$!";#fred为名字,0775为权限

注意不要漏了开头的0(代表八进制),否则就是10进制的755,这等于八进制的1363。

注意下面的用法:

系统会把0755当作十进制来处理,所以相当于我们用01363权限创建了一个目录;

所以需要使用oct函数,他能强行把字符串当作八进制处理,无论其是否以0开头:

删除目录:rmdir函数,用法类似于unlink函数。但是每次只能删除一个目录。

注意:对于非空目录调用rmdir函数会导致失败。所以可以先用unlink删除目录中的内容,在试着移除已经清空的目录。

这个方法并不是很好,如果是两层以上的目录,删除就必须用递归了。具体还不太懂,等着补充!!!

$$是进程代号。

修改权限

chmod 0755,'fred','barney';

但是不能用:+x 或者go=u-w等参数。

修改隶属关系

chown函数修改一系列文件的拥有者及其所属组。拥有者和所属组会被同时修改,并且指定时必须给出数字形式的用户标识符和组标识符。如:

如果要处理的不是数字,而是想merlyn这样的字符串呢?该如何,使用getpwnam函数将用户名转换成用户编号,再使用getgrnam函数把用户组名转换成组编号:

perl学习笔记——目录操作的更多相关文章

  1. Redis学习笔记~目录

    回到占占推荐博客索引 百度百科 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合). ...

  2. python学习笔记目录

    人生苦短,我学python学习笔记目录: week1 python入门week2 python基础week3 python进阶week4 python模块week5 python高阶week6 数据结 ...

  3. Linux命令学习笔记目录

    Linux命令学习笔记目录 最近正在使用,linux,顺便将用到的命令整理了一下. 一. 文件目录操作命令: 0.linux命令学习笔记(0):man 命令 1.linux命令学习笔记(1):ls命令 ...

  4. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  5. Linux Shell编程学习笔记——目录(附笔记资源下载)

    LinuxShell编程学习笔记目录附笔记资源下载 目录(?)[-] 写在前面 第一部分 Shell基础编程 第二部分 Linux Shell高级编程技巧 资源下载 写在前面 最近花了些时间学习She ...

  6. Linux~学习笔记目录索引

    回到占占推荐博客索引 本篇文章是对自己学习Linux及在它的环境下部署工具的一个总结,以方便自己查阅,也给他人一个帮助,本文章同时会不断的更新,欢迎大家订阅! 本目录包括的内容会包括linux基础命令 ...

  7. Javascript学习笔记二——操作DOM

    Javascript学习笔记 DOM操作: 一.GetElementById() ID在HTML是唯一的,getElementById()可以定位唯一的一个DOM节点 二.querySelector( ...

  8. MongoDB学习笔记:Python 操作MongoDB

    MongoDB学习笔记:Python 操作MongoDB   Pymongo 安装 安装pymongopip install pymongoPyMongo是驱动程序,使python程序能够使用Mong ...

  9. knockout学习笔记目录

    关于knockout学习系列的文章已经写完,这里主要是做个总结,并且将目录罗列出来,方便查看.欢迎各位大神拍砖和讨论. 总结 kncokout是一个轻量级的UI类库,通过MVVM模式使前端的UI简单话 ...

随机推荐

  1. 【转】mybatis循环map的一些技巧

    原文地址:http://blog.csdn.net/linminqin/article/details/39154133 循环key: <foreach collection="con ...

  2. SPOJ-913

    Query on a tree II Time Limit: 433MS   Memory Limit: 1572864KB   64bit IO Format: %lld & %llu Su ...

  3. 【hdoj_1049】Climbing Worm

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1049 以 上升-下降 一次为一个周期,一个周期时间为2分钟,每个周期上升距离为(u-d).先只考虑上升,再 ...

  4. 数位dp模版(dp)

    #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> ...

  5. 哈希+Bfs【P2730】 魔板 Magic Squares

    没看过题的童鞋请去看一下题-->P2730 魔板 Magic Squares 不了解康托展开的请来这里-->我这里 至于这题为什么可以用康托展开?(瞎说时间到. 因为只有8个数字,且只有1 ...

  6. 洛谷——P1722 矩阵 II

    P1722 矩阵 II 题目背景 usqwedf 改编系列题. 题目描述 如果你在百忙之中抽空看题,请自动跳到第六行. 众所周知,在中国古代算筹中,红为正,黑为负…… 给定一个1*(2n)的矩阵(us ...

  7. 传统路径导出 VS 直接路径导出(oracle exp direct=y)

    Oracle 传统的Export与Import依旧被保留到11g,而且9i与10g有很多依旧使用Export与Import方式进行备份与恢复的企业.从Oracle 7.3开始,传统的exp导出程序提供 ...

  8. 【并查集+离散化】BZOJ4195- [Noi2015]程序自动分析

    [题目大意] 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3,…代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的 ...

  9. openresty总结

    协程 1.例如当获取的数据没有前后依赖关系时,可以使用ngx.thread.spawn和ngx.thread.wait同时从数据库不同的库.表或者不同来源(mysql,redis等)获取数据. htt ...

  10. 1.4(java学习笔记) 面向对象内存分析

      首先介绍几个概念 栈: 1.栈是方法执行的内存模型,每调用一个方法都会创建一个栈帧. 2.jvm为每个线程创建一个栈,存放方法相关信息,栈属于线程私有不共享. 3.栈由系统自动分配,是连续的内存空 ...