使用Perl创建嵌套/递归目录

时间:2011-07-10 08:01:28

标签: perl

我编写了一个C ++程序,它读取文件并输出具有相同名称的文件,稍作修改。现在我需要递归浏览到(任何包的)目录,然后在具有相同目录结构的单独目录中创建文件。

我可以使用

浏览目录
@file_list = `find <package directory> -name '*.cpp'`;

我正试图像这样执行我的程序:

foreach (@file_list) {
    # This gives error as sh: other_dir/./lev1/lev2/filename.cpp: not found
    ./myexe $_ other_dir/$_;
}

以前我编写过一个shell脚本,它对于在单个目录中包含文件的包很有效。脚本如下:

  1 #!/bin/bash
  2 #echo off
  3 rm -rf demac_dir
  4 mkdir demac_dir
  5 for i in `ls *.h *.cpp`
  6 do
  7 echo processing file ${i} ...
  8 ./main ${i} demac_dir/${i}
  9 done

现在我正在尝试使用嵌套子目录中包含.cpp和.h文件的包(即wxWidgets)来做同样的事情。所以我编写了以下Perl脚本(在ysth的建议之后)。

  1 #!/usr/bin/perl -l
  2 use File::Path 'make_path';
  3 use File::Basename 'dirname';
  4
  5 `rm -rf demac_dir`;
  6 `mkdir demac_dir`;
  7 @l1 =  `find . -name '*.h'`;
  8 @l2 =  `find . -name '*.cpp'`;
  9 @l3 =  `find . -name '*.cc'`;
 10 push(@l , @l1, @l2, @l3);
 11 foreach (@l) {
 12   print "processing file $_ ...";
 13   make_path( dirname( "demac_dir/$_" ));
 14   ## `touch touch demac_dir/$_`;
 15   `sudo ./main $_ demac_dir/$_`;
 16 }
 17

2 个答案:

答案 0 :(得分:1)

呃,你错过了一个系统()或那里我认为是你真实代码的东西。

要制作所需的目录,请尝试:

use File::Path 'make_path';
use File::Basename 'dirname';

foreach (@file_list) {
    make_path( dirname( "other_dir/$_" ) );
    ...
}

更新:看到你的代码,看起来你在文件名的末尾留下换行符,这可能会给你带来麻烦(虽然我不明白为什么你的./main处理器会产生你说它的错误...)。

在foreach循环之前添加chomp(@l);

答案 1 :(得分:1)

检查morphus

中的FileHandler.pm和TemplateGenerator.pm