Создание вложенных / рекурсивных каталогов с использованием Perl - PullRequest
1 голос
/ 10 июля 2011

Я написал программу на 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/$_;
}

Ранее я написал сценарий оболочки, который хорошо работал с пакетами, содержащими файлы в одном каталоге.Сценарий выглядит следующим образом:

  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

Теперь я пытаюсь сделать то же самое с пакетом (например, wxWidgets ), который имеет файлы .cpp и .h во вложенных подкаталогах.Поэтому я написал следующий скрипт на 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 ]

1 голос
/ 11 июля 2011

Проверьте FileHandler.pm и TemplateGenerator.pm из morphus

1 голос
/ 10 июля 2011

Ошибка, вы упускаете систему () или что-то там, что, как я полагаю, находится в вашем реальном коде.

Чтобы создать нужные вам каталоги, попробуйте:

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

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

Обновление: видя ваш код, похоже, что вы оставляете переводы строк в конце имен файлов, что, вероятно, вызывает у вас проблемы (хотя я не понимаю, почему ваш процессор ./main выдает ошибку, о которой вы говорите ...).

Добавьте chomp(@l); перед циклом foreach.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...