2011-07-10 34 views
1

递归目录我已经写一个C++程序,读取在一个文件中并用稍微修改的相同名称的文件输出。现在我需要递归浏览目录(任何包),然后在具有相同目录结构的单独目录中创建文件。制作嵌套/使用Perl

我可以用

@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 

回答

1

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

为了让你需要的目录,请尝试:

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

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

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

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

+0

的FileHandler.pm和TemplateGenerator.pm是的,我现在越来越嵌套目录。但仍当我执行命令 './myexe $ _ other_dir/$ _'; 我得到了同样的错误 SH:other_dir /./ LEV1/LEV2/filename.cpp:找不到 –

+0

为什么你所期望的文件在那里?你的find命令在''中寻找文件,不管是什么。您的命令是使用'other_dir /'查找找到的路径的前缀。 –

+1

您将不得不显示您的实际代码以获得更多帮助。 – ysth

1

检查从morphus

+0

感谢您的建议,但我得到了与YSTH的建议工作的事情。当我有一些额外的时间时,我会看看morpus。 –