2012-04-07 7 views
-1

私は、パッケージのバージョンに基づいてパッケージをソートするために使用され、このPerlスクリプトを持っている:Perlスクリプトを変更して、バージョンに基づいて異なるディレクトリにあるパッケージを移動するには?

#!/usr/bin/perl -w 
# 
# Compare versions of all *.rpm files against the 
# latest packages installed (if installed) 
# 
# Usage: 
# rpmver.pl 
# This script looks for all *.rpm files. 
# 
use strict; 
use RPM2; 
my $rpm_db = RPM2->open_rpm_db(); 
for my $filename (<*.rpm>) { 
    my $h = RPM2->open_package($filename); 
    # Ensure we compare against the newest 
    # package of the given name. 
    my ($installed) = 
     sort { $b <=> $a } $rpm_db->find_by_name($h->name); 
    if (not $installed) { 
     printf "Package %s not installed.\n", $h->as_nvre; 
    } else { 
     my ($result) = ($h <=> $installed); 
     if ($result < 0) { 
      printf "Installed package %s newer than file %s\n", 
      $installed->as_nvre, 
      $h->as_nvre; 
     } else { 
      printf "File %s newer than installed package %s\n", 
      $h->as_nvre, 
      $installed->as_nvre; 
     } 
    } 
} 

私はSRPMSとLinuxのリポジトリを持っています。最新のパッケージを別のディレクトリに移動したい。例えばlatest_packagesである。スクリプトはどのように変更する必要がありますか?

+0

これは、ディレクトリを作成してファイルをそこにコピーするより難しいですか? –

答えて

1

まず、すべての最新のパッケージ名を%latest_packageという名前のハッシュに格納します。すべてのパッケージをチェックした後、ハッシュのキーをループし、最新のパッケージを移動します。

} else { 
    printf "File %s newer than installed package %s\n", ... 
    $latest_package{$h->name} = $installed->as_nvre; 
    ... 
} 

ファイルを移動するFile::Copyモジュールのmove()メソッドを使用します。他のIOシステムコール(die)のように扱うことを忘れないでください。エラーの場合は、$!エラーテキスト変数の内容を含めてエラーが発生します(autodieを使用してください)。

foreach my $name (sort keys %latest_package) { 
    File::Copy::move($latest_package{$name}, $LATEST_PACKAGE_DIR) 
     || die "Could not move $latest_package{$name} to $LATEST_PACKAGE_DIR: $!); 
} 

mkdir()機能を使用して、必要に応じてディレクトリを作成します。