开发者社区> meteoric> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

简介: 之前写过用perl删除Windows下的图片缓存缩略图(Thumbs.db)   不过那个只是针对单个的文件,使用unlink方法就可以了(未测试过只读文件删除的情况- -!),那如果要删除指定的一个文件夹,有三种方案: 1、循环文件夹里面的文件,然后逐一删除,再使用rmdir删除空目录 2...
+关注继续查看

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

 

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

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

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

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

 

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

 

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

1、比较运算符

image

2、逻辑运算符

image

特殊说明:操作符和其命名在运算时是完全等价的,但是有不同的优先级。操作符有更高的优先级。例如 && 比 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: ?>

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
根目录下的/lib64也不能删除
根目录下的/lib64也不能删除
0 0
pip安装报错:No such file or directory ; 没有那个文件或目录
pip安装报错:No such file or directory ; 没有那个文件或目录
0 0
Python 技术篇-不使用os模块判断指定路径是文件还是文件夹,使用pathlib库判断文件和文件夹
Python 技术篇-不使用os模块判断指定路径是文件还是文件夹,使用pathlib库判断文件和文件夹
0 0
Qt .pro文件之defineReplace函数的用法,实现lib文件名自动添加后缀“d“
Qt .pro文件之defineReplace函数的用法,实现lib文件名自动添加后缀“d“
0 0
Qt Creator指定临时文件生成目录(MOC_DIR/RCC_DIR等)和PWD/OUT_PWD/.pro官方文档
Qt Creator指定临时文件生成目录(MOC_DIR/RCC_DIR等)和PWD/OUT_PWD/.pro官方文档
0 0
dir listing 目录文件列表索引
一般而言,网站应用都有一个入口,比如说:index.php,index.html,app.js等。通过这个路口,以及相应的路由功能,去到网站各个功能版块。 而网站的目录结构,目录里面的文件列表,一般都是对用户规避的。
686 0
批量修改同一目录下文件名--操作so easy
1.将要改名的文件放在同一个文件夹下; 2.开始 -> 运行(或者ctrl+R) -> 输入cmd,确定-> 切换到该文件夹下; 3.dir /b > rename.xls PS:可合并步骤2和3(在该文件夹下新建文本文档,内容为dir /b > rename.xls  ,文档保存为cmd.bat,双击) 4.打开rename.xls,
912 0
CodeBlocks "no such file or directory" 错误解决方案(创建类找不到头文件)
在CodeBlocks下,有时候需要自己定义类,当然就要添加相应的头文件,但添加进去的头文件明明包含在项目中了, 但编译时还是会报错:no such file or directory;这是为什么呢?   其实是一个很简单的问题,但有些人(比如说我)就会困在这儿,百度也找不到(至少我是没找到),所以写了上来.
1117 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载