Perl文件名通配和文件查找
在shell中使用*来对文件名进行通配扩展,在Perl中也同样支持文件名通配。而且perl中的glob通配方式和shell的通配方式完全一致,实际上perl的glob函数就是直接调用csh来通配的(如果不存在csh,则使用其它shell),也因此通配是一个效率较低的操作。
glob通配函数
元字符 意义
--------------------------------
[] 字符类,匹配中括号中的任一字符。注:
* 匹配任意个字符
? 匹配任意单个字符,注意,不匹配0个
~ 匹配家目录
注意:
[]支持[0-9] [a-z] [A-Z] [A-z]类似的范围通配,其中[A-z]等价于[A-Za-z]- 不支持
[^]取反 - 特别需要注意的是
[1-34]通配的是[1234],而不是1到34,因为中括号只能匹配单个字符
例如:
use 5.010;
say glob "*"; # 匹配当前目录下所有非"."开头的隐藏文件
say glob ".* *"; # 匹配当前目录下所有文件,包括"."开头的隐藏文件
say glob "23.p[ly]"; # 匹配23.pl或23.py文件
say glob "[0-9][0-9].pl" # 匹配两个数值开头的pl文件
say glob "/root/23.p?"; # 匹配家目录下后缀以p开头,后面还有一个字符的文件
say glob "~/*.sh"; # 匹配家目录下的所有sh文件
在glob函数中,空格具有特殊含义,如果想要匹配包含空格的文件名,必须将其使用引号(单/双引号皆可)包围。
例如,要匹配"hello world.log"文件:
glob "'hello w*.log'";
glob '"hello w*.log"';
glob qq('hello w*.log');
glob qq("hello w*.log");
glob q('hello w*.log');
glob q("hello w*.log");
File::Glob模块提供更丰富的通配规则,可以去查看下手册。不过说实话,用到的几乎应该不多。
尖括号<>通配写法
在glob出现之前,人们都使用尖括号表达式来通配。它和glob的实现是完全一致的,仅仅只是从尖括号改为了glob函数。
例如,匹配/root下的sh文件,下面两种写法完全等价:
say </root/*.sh>;
say glob "/root/*.sh";
还可以使用变量替换:
$dir="/etc";
my @file_list = glob "$dir/*.sh $dir/*.py";
my @file_list = <$dir/*.sh $dir/*.py>;
同样,匹配包含空格的文件,可能需要使用引号包围:
say <"hello w*.log">;
在这里需要搞清楚尖括号内的到底会被解析成文件句柄还是解析成通配符。perl的解析规则是:假如尖括号内的内容满足标识符规则(文件句柄的名称要满足此规则),则会解析为文件句柄,否则解析成通配符。
以下是几种情况的区分示例:
my @files = <FOO/*>; # 文件名通配
my @lines = <FOO>; # 读取文件句柄
my @lines = <$fred>; # 读取文件句柄
my $name = 'FOO';
my @files = <$name>; # 读取文件句柄
my @files = <$name/*>; # 文件名通配
从第三行和第5行可以看出,当使用变量且只有变量名替换的时候,会优先解析为文件句柄。
文件查找:关于find2perl脚本
在unix下有一个find工具,用来查找文件非常方便。perl提供了一个find2perl的工具(该工具是在安装perl时自带的),它可以将find查找文件时的表达式转换成perl对应的查找语句。
find2perl的选项和用法和find的用法99%都一样,只有几项额外的是find2perl自身提供的,但这样的选项非常少。
注意,find2perl不是文件查找工具,而是将我们写的find命令表达式转换为等价的perl文件查找语句。
例如,搜索/etc目录下所有".cnf"结尾的文件,find命令的表达式如下:
find /etc -type f -name "*.cnf"
执行find2perl:
[root@xuexi perlapp]# find2perl /etc/ -type f -name "*.cnf"
#! /usr/bin/perl -w
eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
if 0; #$running_under_some_shell
use strict;
use File::Find ();
# Set the variable $File::Find::dont_use_nlink if you're using AFS,
# since AFS cheats.
# for the convenience of &wanted calls, including -eval statements:
use vars qw/*name *dir *prune/;
*name = *File::Find::name;
*dir = *File::Find::dir;
*prune = *File::Find::prune;
sub wanted;
# Traverse desired filesystems
File::Find::find({wanted => \&wanted}, '/etc/');
exit;
sub wanted {
my ($dev,$ino,$mode,$nlink,$uid,$gid);
(($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
-f _ &&
/^.*\.cnf\z/s
&& print("$name\n");
}
可以看出,上面生成了一个wanted子程序,以后要查找"/etc/*.cnf"文件时,只需调用wanted子程序即可。例如:
[root@xuexi perlapp]# find2perl /etc/ -type f -name "*.cnf" >24.plx
[root@xuexi perlapp]# chmod +x 24.plx
[root@xuexi perlapp]# perl 24.plx
/etc/my.cnf
/etc/proxysql.cnf
/etc/pki/tls/openssl.cnf
Perl文件名通配和文件查找的更多相关文章
- linux globbing文件名通配
globbing:文件名通配 元字符: *:匹配任意长度的任意字符 ?:匹配任意单个字符 []:匹配指定范围内的任意单个字符 [a-z]或者[A-Z]或者[[:alpha:]]:匹配任意一个字母 [[ ...
- linux文件查找(find,locate)
文件查找: locate: 非实时,模糊匹配,查找是根据全系统文件数据库进行的: # updatedb, 手动生成文件数据库 速度快 find: 实时 精确 ...
- Linux文件查找工具之find “大宝剑”--转载
原文地址:http://xinzong.blog.51cto.com/10018904/1749465 一.文件查找工具常用软件 locate: locate命令其实是find -name的另一种写法 ...
- linux基础—课堂随笔04_文件查找和压缩
文件查找和压缩 文件查找 1.locate 这个命令是对其生成的数据库进行遍历(生成数据库的命令:updatedb),这一特性决定了用locate查找文件速度很快,但是locate命令只能对文件进 ...
- linux学习14 Linux运维高级系统应用-glob通配及IO重定向
一.回顾 1.bash基础特性:命令补全,路径补全,命令引用 2.文件或目录的复制,移动及删除操作 3.变量:变量类型 存储格式,数据表示范围,参与运算 二.bash的基础特性 1.globbing: ...
- rsyslog 一重启就会开始同步之前所有通配的日志文件
<pre name="code" class="html">[root@dr-mysql01 zjzc_log]# grep '24/Sep/201 ...
- linux 文件查找 find命令详解
一,从索引库查找文件:locate 索引库:操作系统会周期性的遍历根文件系统,然后生成索引库 手动更新索引库:updatedb 语法:locate [OPTION]... PATTERN... 只匹配 ...
- Linux文件查找.md
Linux 文件查找 在Linux系统的查找相关的命令: which 查看可执行文件的位置 whereis 查看文件的位置 locate 配合数据库查看文件位置 find 实际搜寻硬盘查询文件名称 w ...
- node_acl 路径通配
最近做一个基于nodejs的权限管理,查阅了一两天,发现大致是这样的: passportjs node-oauth rbac node_acl express_acl connect-roles 需求 ...
随机推荐
- Chrome扩展插件流程
一.浏览器插件基础步骤: 1.文件最基础的配置 : 一个manifest文件.一个或多个html文件.可选的一个或多个javascript文件.可选的任何需要的其他文件,例如图片:在开发应用(扩展)时 ...
- html5中如何更改、去掉input type默认样式
1.如何去掉input type=date 默认样式 HTML代码: 选择日期:<input type="date" value="2017-06-01" ...
- html图片上传阅览并且点击放大
关闭 qq_31540195的博客 目录视图 摘要视图 订阅 异步赠书:9月重磅新书升级,本本经典 程序员9月书讯 每周荐书: ...
- Matlib
>>> name1=input('请输入第一个名字;') 请输入第一个名字;陈汉彬 >>> name2=input('请输入第二个名字;') 请输入第二个名字;钟宇 ...
- influence maximization
Robust Influence Maximization 首先简要介绍一下这个问题:在一个社交网络图中寻找固定数量的节点,使得这些节点对所有节点的影响值尽可能的大.这个问题由于在病毒式营销,谣言监控 ...
- max (Largest elements in array)
句法: M = max(A) M = max(A,[],dim) [M,I] = max(___) C = max(A,B) ___ = max(___,nanflag) 描述: M=max(A) ...
- CSS中清除浮动的作用以及如何清除浮动
1.什么是浮动,浮动的作用 “浮动”从字面上来理解就是“悬浮移动.非固定”的意思.块级元素(div.table.span…)是以垂直方向排列,而在前端界面中往往要使用水平布局块级元素使界面更美观.这就 ...
- 关于Selenium WebDriver的geckodriver
下载Selenium的最新版本地址:http://selenium-release.storage.googleapis.com/index.html 友情提示:如果一直下载不了,可能是浏览器与下载工 ...
- 2.SpringMVC注解开发
1.创建SpringMVC项目 配置web.xml <?xml version="1.0" encoding="UTF-8"?> <web-a ...
- Android逆向之静态分析
想必打过CTF的小伙伴多多少少都触过Android逆向,所以斗哥将给大家整一期关于Android逆向的静态分析与动态分析.本期先带来Android逆向的静态分析,包括逆向工具使用.文件说明.例题解析等 ...