免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1575 | 回复: 9
打印 上一主题 下一主题

自己写的find [复制链接]

论坛徽章:
3
摩羯座
日期:2013-09-04 12:01:36申猴
日期:2013-10-23 12:12:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-05-17 17:44 |只看该作者 |倒序浏览
本帖最后由 grshrd49 于 2013-07-19 12:23 编辑

觉得好玩就写个了
运行需要两个参数 第一个是起始目录 第二个是目标文件或目录名
  1. #!/opt/ActivePerl-5.12/bin/perl
  2. #根据大神的建议,去除了函数中的带名字的函数
  3. #将特殊变量$a改成e_path,并初始化
  4. use strict;
  5. use Cwd;

  6. my $source_dir = shift @ARGV; #从什么目录开始查找
  7. my $tag = shift @ARGV; #要查找目录或者文件名

  8. &copydir($source_dir);
  9. print "search end!!\n";

  10. sub copydir
  11. {
  12.         my $up_dir = shift @_;
  13.         chdir $up_dir;
  14.         my @mydir = <$up_dir\/*>;
  15.         my @myfile = <*>;
  16.         my $fileindex = -1;
  17.         for my $e_path (@mydir){
  18.                 $fileindex++;
  19.                 #print "$e_path----$myfile[$fileindex]\n";
  20.                 next if (-l $e_path);
  21.                 if (-d $e_path){
  22.                         if ( $myfile[$fileindex] eq $tag ){
  23.                                 my $path = getcwd;
  24.                                 print "-- searched dir ->$myfile[$fileindex]<-\n";
  25.                                 #print "-- path = $path\/$myfile[$fileindex]\n\n";  #问题在这里
  26.                                 print "-- path = $e_path\n\n";
  27.                         }
  28.                         &copydir($e_path);
  29.                 }else{
  30.                         if ( $myfile[$fileindex] eq $tag ){
  31.                                 my $path = getcwd;
  32.                                 print "-- searched file ->$myfile[$fileindex]<-\n";
  33.                                 print "-- path = $e_path\n\n";
  34.                         }
  35.                 }
  36.         }
  37. }


  38. __END__
  39. #!/opt/ActivePerl-5.12/bin/perl
  40. use strict;
  41. use Cwd;

  42. my $from_dir = shift @ARGV; #从什么目录开始查找
  43. my $tag = shift @ARGV; #要查找目录或者文件名
  44. &search($from_dir,$tag);

  45. sub search
  46. {
  47.         my $source_dir = shift @_;
  48.         my $tag = shift @_;
  49.         &copydir($source_dir);
  50.         print "search end!!\n";

  51.         sub copydir
  52.         {
  53.                 my $up_dir = shift @_;
  54.                 chdir $up_dir;
  55.                 my @mydir = <$up_dir\/*>;
  56.                 my @myfile = <*>;
  57.                 my $fileindex = -1;
  58.                 for $a (@mydir){
  59.                         $fileindex++;
  60.                         print "$a----$myfile[$fileindex]\n";
  61.                         next if (-l $a);
  62.                         if (-d $a){
  63.                                 if ( $myfile[$fileindex] eq $tag ){
  64.                                         my $path = getcwd;
  65.                                         print "-- searched dir ->$myfile[$fileindex]<-\n";
  66.                                         #print "-- path = $path\/$myfile[$fileindex]\n\n";  #问题在这里
  67.                                         print "-- path = $a\n\n";
  68.                                 }
  69.                                 &copydir($a);
  70.                         }else{
  71.                                 if ( $myfile[$fileindex] eq $tag ){
  72.                                         my $path = getcwd;
  73.                                         print "-- searched file ->$myfile[$fileindex]<-\n";
  74.                                         print "-- path = $a\n\n";
  75.                                 }
  76.                         }
  77.                 }
  78.         }
  79. }
复制代码

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
2 [报告]
发表于 2013-05-18 10:14 |只看该作者
收藏了!

论坛徽章:
1
2015亚冠之阿尔纳斯尔
日期:2015-11-11 18:05:28
3 [报告]
发表于 2013-07-18 14:29 |只看该作者
有一事不明。。请LZ指教..

研究一上午你写的脚本,学到了很多,不过有一处不太明白

#./find.pl  /etc passwd
我这样去执行脚本,搜到的结果是,为什么  /etc/passwd没有出来?
-- searchd dir -> passwd<-
-- path = /etc/pam.d/passwd

-- searchd dir -> passwd<-
-- path = /etc/pango/x86_64-redhat-linux-gnu/passwd

-- searchd dir -> passwd<-
-- path = /etc/test/passwd

search end!!

论坛徽章:
3
摩羯座
日期:2013-09-04 12:01:36申猴
日期:2013-10-23 12:12:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34
4 [报告]
发表于 2013-07-18 15:48 |只看该作者
回复 3# kaixin9ok

我最怕主要的逻辑出问题,调试后发现是输出显示的问题。
火眼金睛呵 厉害的

#print "-- path = $path\/$myfile[$fileindex]\n\n";  #问题在这里
print "-- path = $a\n\n";                        #直接输出列表中的路径就好了

论坛徽章:
1
2015亚冠之阿尔纳斯尔
日期:2015-11-11 18:05:28
5 [报告]
发表于 2013-07-18 16:01 |只看该作者
本帖最后由 kaixin9ok 于 2013-07-18 16:02 编辑

回复 4# grshrd49


    下午就一直在学习你写的脚本,刚学几天,还请多多指教啊

   还是没有太明白为什么写 $a 就可以了呢。
这里输出$a  和输出  $path/$myfile[$fileindex]
不应该是一样的效果吗?还是说因为getcwd方法取出的路径不一样?

论坛徽章:
3
摩羯座
日期:2013-09-04 12:01:36申猴
日期:2013-10-23 12:12:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34
6 [报告]
发表于 2013-07-18 18:03 |只看该作者
本帖最后由 grshrd49 于 2013-07-18 18:04 编辑

回复 5# kaixin9ok


递归操作有点绕哈哈!
因该是这样的,这个问题因该是出在从子目录递归出来后,出现的一个目录 这个目录如果是查询的目录就会出现这样的bug
当一次递归出来以后程序走了 for $a (@mydir) 的下一个元素 此时perl的工作目录依然在上一次递归所在的目录,没有走chdir ,所以才会把上一个内层递归的目录与外层递归查询出的文件名或者目录名组装然后显示出来
所以才需要用for列表中的存的路径来显示,那个才是正确的

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
7 [报告]
发表于 2013-07-19 10:30 |只看该作者
grshrd49 发表于 2013-05-17 17:44
觉得好玩就写个了
运行需要两个参数 第一个是起始目录 第二个是目标文件或目录名


提两个错误啊

一不要在函数里面定义带名字的函数,带名字的函数相当于全局变量可以再 search 外面调用,那在 search 外面调用 copydir 那 $tag 的值是什么?

二 23行的 $a 没有声明, $a $b 需要用在 sort 里面特别处理过在 use strict; 下也不用声明但也不能滥用啊

论坛徽章:
1
2015亚冠之阿尔纳斯尔
日期:2015-11-11 18:05:28
8 [报告]
发表于 2013-07-19 11:46 |只看该作者
回复 7# zhlong8


    嗯,学习了

论坛徽章:
1
2015亚冠之阿尔纳斯尔
日期:2015-11-11 18:05:28
9 [报告]
发表于 2013-07-19 11:47 |只看该作者
回复 8# kaixin9ok


    学习了..  

论坛徽章:
3
摩羯座
日期:2013-09-04 12:01:36申猴
日期:2013-10-23 12:12:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34
10 [报告]
发表于 2013-07-19 12:28 |只看该作者
回复 7# zhlong8


很兴奋有不同的声音能指责我这个糟糕的脚本,这也是我在perl学习道路中不可获取的动力哈哈!
根据你的建议我优化了代码。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP