Читать содержимое из файла и найти полное имя файла на диске - PullRequest
1 голос
/ 08 июня 2009

Моя проблема в том, что у меня есть куча имен файлов без добавленной версии (версия постоянно меняется). Имена файлов находятся в файле в определенной последовательности, и мне нужно получить последнюю версию из папки, а затем последовательно установить ее. Логика будет:

  1. проверять файл с содержимым
    • чтение строки из файла
    • используя это в качестве ключа, получите доступ к папке и сопоставьте то же самое
    • если найдено, запишите полное имя файла в файл с добавлением нескольких символов
    • если не найден, пропустите и вернитесь к строке 1, пока все строки в файле не будут закончены

Какой язык лучше использовать: сценарий оболочки или Perl для такой задачи? И если кто-то может предоставить некоторые подсказки в виде кода: -)

Ответы [ 3 ]

3 голосов
/ 08 июня 2009

Я бы прочитал все ваши частичные имена файлов, а затем перебрал бы папку, сопоставляя полные имена файлов с частичными. Точная реализация будет зависеть от некоторых деталей. Должны ли полные имена файлов появляться в том же порядке, что и частичные? Можете ли вы вывести частичное имя файла из полного имени файла?

Обновление: итак, что-то вроде (при условии, что $ infile, $ outfile и $ indir уже открыли файл и dirhandles, и подпрограмма перевода partial_filename_from_full, которая возвращает undef для таких вещей, как каталоги или несущественные файлы):

chomp( my @partial_filenames = readline( $infile ) );

while ( my $filename = readdir( $indir ) ) {
    my $partial_filename = partial_filename_from_full( $filename );
    if ( defined $partial_filename ) {
        $full_filename{ $partial_filename } = $filename;
    }
}

for my $partial_filename ( @partial_filenames ) {
    if ( exists $full_filename{ $partial_filename } ) {
        print $outfile $full_filename{ $partial_filename }, "\n";
    } else {
        # error? just skip it? you decide
    }
}

Если для одного частичного имени файла задано несколько полных имен файлов, вместо назначения:

        $full_filename{ $partial_filename } = $filename;

вы бы определили, было ли $ filename "лучше", чем ранее встречавшееся один.

1 голос
/ 08 июня 2009

Ваш вопрос не очень понятен, но я предполагаю, что у вас есть каталог, содержащий имена файлов, такие как:

  • fileA01
  • fileA02
  • fileB03
  • fileB05
  • fileB12
  • fileC02
  • fileD09
  • fileE22

Файл, который вы сканируете «с содержимым», содержит список имен, таких как:

  • FiLea
  • FILEB
  • fileE

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

  • fileA02
  • fileB12
  • fileE22

Вам нужно будет решить, как именно сравниваются версии - я использовал двухзначные номера версий, но вы не указали свои ограничения.

Я бы, вероятно, использовал Perl для этого. Сначала я прочитал весь «файл с содержимым» в память, а затем создал регулярное выражение для распознавания имен файлов - возможно, с включенным определением номера версии. Я бы использовал opendir, readdirclosedir) для обработки каталога. Для каждой строки я сопоставляю ее с регулярным выражением и определяю, является ли имя самой последней версией любого из искомых файлов. Если это так, я бы записал имя файла в хеш, проиндексированный по имени файла без версии (следовательно, если файл A01 был прочитан первым, то у меня было бы $filelist{fileA} = "fileA01"; за исключением того, что, конечно, и ключ хеша, и полное имя файла были бы в переменных.

Делать это в оболочке будет сложнее. Используя самые мощные функции Bash, это возможно выполнимо; Я бы все еще использовал Perl (или Python, или любой другой язык сценариев).

0 голосов
/ 08 июня 2009

Я бы использовал awk.

awk -f myawk.awk

myawk.awk

BEGIN{
}
{
    myfilename = $0;
    retval = getline otherfile < myfilename;
    if (retval == -1) # check the correct syntax
    {
        # file does not exist. do the necessary error handling

    }
    else
    {
        # File exists. so do what you want.
        # perhaps you might want to write to a new file with the modified filename
    }
}
END{
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...