如何使用perl删除目录及其内容?

时间:2015-03-10 17:12:08

标签: perl

我在主文件夹中有几个子文件夹。每个子文件夹中都有一个.txt文件。首先,代码将在主文件夹中创建“results”文件夹。它将在每个.txt中搜索“Frequencies”字样并打印到新文件(在结果文件夹中)前三列,包括“Frequencies”字样。 当我第二次运行代码时,它应该删除结果文件。但是当我第二次运行它时出现以下错误。如何删除此目录(结果)及其内容? (首先运行时它会起作用)

错误:

Undefined subroutine &main::rmtree called at xxx.pl line 9.

代码:

#!/usr/bin/env perl
use strict;
use warnings;
use File::Path qw/make_path/;
use Cwd;

my $dir = cwd();
my $check_result_file = "$dir/results/";
rmtree($check_result_file);

4 个答案:

答案 0 :(得分:2)

use File::Path qw/make_path/; 

告诉File :: Path导出make_path,覆盖正常导出的子列表(mkpathrmtree)。如果您还想要导出rmtree,则需要指定它。

use File::Path qw( make_path rmtree ); 

从技术上讲,您还可以使用以下内容:

use File::Path; 
use File::Path qw( make_path ); 

但是,我认为明确列出所有子I导入是一个好习惯,所以我非常赞成我提供的第一个解决方案。


顺便说一下,make_path的File :: Path版本也有remove_treeremove_tree首选rmtree

答案 1 :(得分:0)

您在use行末尾错过了分号:

use File::Path;
              ^ add this

答案 2 :(得分:0)

两件事,首先,正如jwodder所提到的,你在使用线的末尾遗漏了一个分号:

use File::Path; <--

其次,在检查目录时,您希望使用-d而不是-e。 -d将检查目录是否存在,而-e将检查是否存在文件。您还需要检查条件。

if ( -d $check_folder)
{ //dostuff }
else
{ //do other stuff}

或unix变体(假设你先对文件夹进行了正确的检查)

my $result = system("rm -rf $check_folder);

答案 3 :(得分:0)

对于没有“ rm”的窗口,您可以在系统上执行。

$dir = "C:/somepath/path";
$del_directory = "\@RD /S /Q \"$dir\"";
$exec_del = `$del_directory`;
  • @RD,是删除目录
  • / S,删除目录中的所有目录和文件 目录,包括子目录。
  • / Q,相当模式