从文件中读取内容并在磁盘上查找完整文件名

时间:2009-06-08 05:17:21

标签: perl shell

我的问题是我有一堆没有附加版本的文件名(版本每次都在不断变化)。文件名以特定顺序存在于文件中,我需要从文件夹中获取最新版本,然后依次安装。逻辑是:

  1. 扫描包含内容的文件
    • 从文件中读取一行
    • 使用此键作为键,访问该文件夹并匹配相同的
    • 如果找到,请将完整的文件名写入附加了一些字符的文件
    • 如果找不到,跳过并循环到第1行,直到文件中的所有行都完成
  2. 使用的最佳语言是什么:shell脚本或Perl用于执行此类任务?如果有人能以代码的形式提供一些提示: - )

3 个答案:

答案 0 :(得分:3)

我会读取你所有的部分文件名然后循环遍历匹配完整文件名的文件夹与部分文件名。确切的实施将取决于一些细节。 完整的文件名是否需要以与部分文件名相同的顺序出现?你能从完整的文件名中获得部分文件名吗?

更新:所以,类似的(假设$ infile,$ outfile和$ indir已经打开文件和dirhandles,以及转换例程partial_filename_from_full,它返回目录或非相关文件之类的东西):

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 :(得分:1)

你的问题不是很清楚,但我猜你有一个包含文件名的目录,如:

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

您使用内容'扫描的文件包含一系列名称,例如:

  • 的fileA
  • FILEB
  • fileE

并且您希望代码在相应文件名的最高版本号的目录中查找条目:

  • fileA02
  • fileB12
  • fileE22

你必须确切地确定如何比较版本 - 我使用了2位数的版本号,但你没有说明你的约束。

我可能会使用Perl。首先,我将整个'内容文件'读入内存,然后创建一个怪物正则表达式来识别文件名 - 可能包含版本号检测。我使用opendirreaddir(和closedir)来处理目录。对于每一行,我将它与正则表达式匹配,并捕获该名称是否是任何搜索文件的最新版本。如果是这样,我会在哈希中捕获文件名,用无版本文件名索引(因此,如果首先读取fileA01,那么我会有$filelist{fileA} = "fileA01";,当然除了哈希键和完整文件名将是变量。

在shell中执行它会更难。使用Bash最强大的功能,它可能是可行的;我仍然使用Perl(或Python,或任何脚本语言)。

答案 2 :(得分:0)

我会用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{
}