使用Perl的File::Path模块删除非空文件夹

之前写过用perl删除Windows下的图片缓存缩略图(Thumbs.db)

不过那个只是针对单个的文件,使用unlink方法就可以了(未测试过只读文件删除的情况- -!),那如果要删除指定的一个文件夹,有三种方案:

1、循环文件夹里面的文件,然后逐一删除,再使用rmdir删除空目录

2、使用File模块,使用remove_tree方法

3、调用系统命令进行删除(这个在linux下处理的较好,windows下未进行测试)

我选择了第二种方案,使用File::Path模块,点击查看详情>>

之前对Perl的操作符总结的并不好,这里小结一下:

1、比较运算符

2、逻辑运算符

特殊说明:操作符和其命名在运算时是完全等价的,但是有不同的优先级。操作符有更高的优先级。例如 && 比 and 有更高的优先级。

3、单引号与双引号的区别

示例一:

1: my $test = "11111";

       2: print 'test';

得到的将是字符串”$test”

示例二:

1: my $test = "11111";

       2: print "$test";

将得到变量$test的值 “11111”

好的习惯是全部使用双引号(”),在需要转义的地方使用”\”

上面是注意事项,回到写代码的初衷,为了删除某一指定文件夹下面的 “.svn”目录以及“Thumbs.db”文件。

1: #!/usr/bin/perl

       2: use strict;

       3: use warnings;

       4: use File::Path 'remove_tree';

       5:  

       6: my $path = "C:/xx/assets";

       7: my $fileCount = 0;

       8: my $folderCount = 0;

       9:  

      10: sub del_handler {

      11:     my $path = $_[0];

      12:     my $handle;

      13:     my $subpath;

      14:  

      15:     if (-d $path) {

      16:         if (opendir($handle, $path)) {

      17:             while ($subpath = readdir($handle)) {

      18:                 if (!($subpath =~ m/^\.$/) and !($subpath =~ m/^\.\.$/)) {

      19:                     my $p = $path."/$subpath";

      20:  

      21:                     if (-d $p) {

      22:                        if ($subpath eq ".svn") {

      23:                              print "delete folder .svn : $p\n";

      24:                           remove_tree($p);

      25:                           $folderCount++;

      26:                        } else {

      27:                             del_handler($p);

      28:                        }

      29:                     } elsif(-f $p and $subpath eq "Thumbs.db") {

      30:                       unlink($p);

      31:                       $fileCount++;

      32:                       print "delete file Thumbs.db : $p\n";

      33:                     }

      34:                 }

      35:             }

      36:             closedir($handle);

      37:            }

      38:     }

      39: }

      40:  

      41: del_handler($path);

      42:  

      43: print "\n\ndelete Thumbs.db files num : $fileCount\n";

      44: print "delete .svn folder num : $folderCount";

上面的代码显示不太合理,因为把路径给写死了。如何在调用的时候,例如这样:perl del.pl path

就是path在调用的时候才传进去呢?用$ARGV[0] 就可以得到,调用之前判断一下。

1: #!/usr/bin/perl

       2: use strict;

       3: use warnings;

       4: use File::Path 'remove_tree';

       5:  

       6:  

       7: my $fileCount = 0;

       8: my $folderCount = 0;

       9:  

      10: sub del_handler {

      11:     my $path = $_[0];

      12:     my $handle;

      13:     my $subpath;

      14:  

      15:     if (-d $path) {

      16:         if (opendir($handle, $path)) {

      17:             while ($subpath = readdir($handle)) {

      18:                 if (!($subpath =~ m/^\.$/) and !($subpath =~ m/^\.\.$/)) {

      19:                     my $p = $path."/$subpath";

      20:  

      21:                     if (-d $p) {

      22:                        if ($subpath eq ".svn") {

      23:                              print "delete folder .svn : $p\n";

      24:                           remove_tree($p);

      25:                           $folderCount++;

      26:                        } else {

      27:                             del_handler($p);

      28:                        }

      29:                     } elsif(-f $p and $subpath eq "Thumbs.db") {

      30:                       unlink($p);

      31:                       $fileCount++;

      32:                       print "delete file Thumbs.db : $p\n";

      33:                     }

      34:                 }

      35:             }

      36:             closedir($handle);

      37:            }

      38:     }

      39: }

      40:  

      41: my $path = $ARGV[0] or die "Need target folder !\n";

      42: print "Target Folder is : $path \n\n";

      43:  

      44: del_handler($path);

      45:  

      46: print "\n\ndelete Thumbs.db files num : $fileCount\n";

      47: print "delete .svn folder num : $folderCount\n";

使用方法(同样适用于linux)cmd切换到pl文件的目录,如c:\perlApp,C:\perlApp>perl del_svn.pl  C:\theme\defaultTheme\assets

当然删除文件和目录,使用windows自带的dos脚本更简单一些(存为bat双击运行即可):

1: @echo off

       2: title 文件目录SVN标志清除工具

       3:  

       4: :start

       5: ::启动过程,切换目录

       6: set pwd=%cd%

       7: cd %1

       8: echo 工作目录是:& chdir

       9:  

      10: :input

      11: ::获取输入,根据输入进行处理

      12: set source=:

      13: set /p source=确定要清楚当前目录下的svn信息吗?[Y/N/Q] 

      14: set "source=%source:"=%"

      15:  

      16: if "%source%"=="y" goto clean 

      17: if "%source%"=="Y" goto clean 

      18: if "%source%"=="n" goto noclean 

      19: if "%source%"=="N" goto noclean 

      20: if "%source%"=="q" goto end

      21: if "%source%"=="Q" goto end

      22: goto input

      23:  

      24: :clean

      25: ::主处理过程,执行清理工作

      26: @echo on

      27: @for /d /r %%c in (.svn) do @if exist %%c ( rd /s /q %%c & echo     删除目录%%c)

      28: @echo off

      29: echo "当前目录下的svn信息已清除"

      30: goto end

      31:  

      32: :noclean

      33: ::分支过程,取消清理工作

      34: echo "svn信息清楚操作已取消"

      35: goto end

      36:  

      37: :end

      38: ::退出程序

      39: cd "%pwd%"

      40: pause

但有时间这个bat并不能很好的完成工作,非得到未删除干净的目录下再次运行,有点繁琐(为什么出现这种现象,暂时未查到原因~ ~)

DOS下还有一个Copy文件的命令也比较有用:xcopy,例如:

xcopy D:\Aptana_work\9917\search\*  \\192.168.0.178\application\search\search\   /E /Y /D

后面/E /Y /D是参数,具体的说明可以在DOS下查看

如果使用php或是python来删除文件夹和文件的话,也能做的很好,我只是当作练练手。下面是php代码,写的一个测试例子(代码规整的并不好,接触php不久..)

1: <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

       2:  

       3: <?php

       4:     

       5:     function deleteDir($path) {

       6:         if (is_dir($path)) {

       7:             

       8:             echo $path.'  开始遍历文件夹...<br/>';

       9:             

      10:             if ($handle = opendir($path)) {

      11:                 while(($file = readdir($handle)) !== false) {

      12:                     

      13:                     if ($file != "." && $file != "..") {

      14:                         $path2 = $path.'/'.$file;

      15:                         

      16:                         if (preg_match("/.html?$/", $file)) {

      17:                             deleteHandler($path2);

      18:                             

      19:                             if (is_dir($path2)) {

      20:                                 if (rmdir($path2)) {

      21:                                     echo '文件夹'.$path2.'删除成功!<br/>';

      22:                                 } else {

      23:                                     echo '文件夹'.$path2.'删除失败!<br/>';

      24:                                 }

      25:                             }

      26:                         } else if (is_dir($path2)) {

      27:                             if (!rmdir($path2)) {

      28:                                 deleteDir($path2);    

      29:                             }                            

      30:                         }

      31:                     }

      32:                     

      33:                 }

      34:                 

      35:                 closedir($handle);

      36:             }

      37:             

      38:         } else {

      39:             echo '"'.$path.'"不是一个正确的文件夹路径...';            

      40:         }

      41:     }

      42:     

      43:     function deleteHandler($path) {

      44:         if (is_dir($path)) {

      45:             $handle = opendir($path);

      46:             

      47:             while (($file = readdir($handle)) !== false) {

      48:                 if ($file != '.' && $file != '..') {

      49:                     $path2 = $path.'/'.$file;

      50:                     

      51:                     deleteHandler($path2);

      52:                 }

      53:             }

      54:             

      55:             closedir($handle);

      56:         } else if (is_file($path)) {

      57:             

      58:             if (unlink($path)) {

      59:                 echo '文件'.$path.'删除成功<br/>';

      60:             } else {

      61:                 echo '文件'.$path.'删除失败<br/>';

      62:             }

      63:             

      64:         }

      65:     }

      66:     

      67:     deleteDir("D:/test");

      68: ?>

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏web前端

Button按钮--inject与provide

inject 和 provider 是vue中的组合选项,需要一起使用。目的是允许一个祖先组件向其所有子孙后代注入依赖(简单地说就是祖先组件向子孙后代传值的一种...

28510
来自专栏黑泽君的专栏

写给新入职的毕业生们

5710
来自专栏一直在跳坑然后爬坑

行观点与列观点

8310
来自专栏黑泽君的专栏

输入输出流体系图

8210
来自专栏本立2道生

电脑护眼设置:蓝色光波过滤

本人高度近视,因此平时使用电脑时总会关注如何护眼,安卓手机上使用了app “蓝色光波过滤”,感觉不错,就想看看PC上有没有相应的软件,找倒是找到了,不过需要先安...

12810
来自专栏黑泽君的专栏

程序员眼中的英语单词

10710
来自专栏Modeng的专栏

思考:如何高效的说服别人

国庆期间去一个同学那里去玩耍,因为他是做服务行业的所以国庆没有放假,所以我就只能一边看他做生意,一边等他清闲了聊上两句。

9510
来自专栏日知录

跃迁:成为高手的技术

14220
来自专栏轮子工厂

简历修改了100遍,却仍然没有找到满意的工作,你可能需要看一下这篇文章

最近恰逢秋招,身边很多朋友都跟我抱怨说,简历投出去了不少,可是很多都是石沉大海,没有了回音。于是就急的不行,纷纷跑过来请教简历制作大法。

12820
来自专栏凌帅的阅读思考与实践

加密货币必将成为世界货币称霸全球(二)

[第一篇文章](https://mp.weixin.qq.com/s/8-FskjZJFRJPd4oFl4BAww)中,凌帅分析了加密货币本身的先进性及作为全球...

17020

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励