合并-按一定顺序附加二进制文件的内容

时间:2019-03-22 17:36:26

标签: linux perl

在源目录中,我有一些名为1.bin,2.bin,3.bin等的二进制文件。在dest目录中,我具有相同的命名二进制文件,但内容不同。我需要将dest目录的内容附加到源目录中具有相同名称的文件中,但还要确保将目标目录的内容添加到源目录的内容下方。这是我来的地方:

#!/usr/bin/perl
$source_dir = "/data/source_dir";
$dest_dir   = "/data/dest_dir";
opendir ($source, $source_dir);
@source_files = readdir $source;
foreach $each_file (@source_files){
    if($each !~ /^(\.|\.\.)$/) {
        open $file_h , "< $source_dir/$each_file";
        @contents = <$file_h>;
        open $dest_file, ">>$dest_dir/$each_file";
        print $dest_file @contents;
        @contents =();
     }
}

如何确定dest目录中的1.bin已附加-合并到源目录的内容下?

那么代码应该是什么样子?

1 个答案:

答案 0 :(得分:2)

一种可能的解决方案

  • use autodie自动处理打开/关闭错误
  • File::Spec用于处理路径名
  • 使用File::Slurper以二进制形式读取源文件
  • 打开目标文件以附加为二进制文件
    • 使用现代的3参数版本的open()
    • 将内容打印到目标文件句柄
#!/usr/bin/perl
use warnings;
use strict;
use autodie;

use File::Spec;
use File::Slurper qw(read_binary);

my $source_dir = "tmp/source_dir";
my $dest_dir   = "tmp/dest_dir";

opendir(my $source, $source_dir);

foreach my $file (readdir $source) {
    unless ($file =~ /^\.\.?$/) {
        my $content = read_binary(File::Spec->catfile($source_dir, $file));
        open(my $ofh, '>> :raw :bytes', File::Spec->catfile($dest_dir, $file));
        print $ofh $content;
        close($ofh);
    }
}

closedir($source);

exit 0;

试运行:

$ ls -lhtR tmp/
...
tmp/dest_dir:
-rw-rw-r--. 1 stefanb stefanb 33 22. 3. 20:32 1.bin
-rw-rw-r--. 1 stefanb stefanb 27 22. 3. 20:32 2.bin
-rw-rw-r--. 1 stefanb stefanb 15 22. 3. 20:32 3.bin

tmp/source_dir:
-rw-rw-r--. 1 stefanb stefanb 11 22. 3. 20:32 1.bin
-rw-rw-r--. 1 stefanb stefanb  9 22. 3. 20:32 2.bin
-rw-rw-r--. 1 stefanb stefanb  5 22. 3. 20:31 3.bin

$ perl dummy.pl

$ ls -lhtR tmp/
...
tmp/dest_dir:
-rw-rw-r--. 1 stefanb stefanb 44 22. 3. 20:34 1.bin
-rw-rw-r--. 1 stefanb stefanb 36 22. 3. 20:34 2.bin
-rw-rw-r--. 1 stefanb stefanb 20 22. 3. 20:34 3.bin

tmp/source_dir:
-rw-rw-r--. 1 stefanb stefanb 11 22. 3. 20:32 1.bin
-rw-rw-r--. 1 stefanb stefanb  9 22. 3. 20:32 2.bin
-rw-rw-r--. 1 stefanb stefanb  5 22. 3. 20:31 3.bin

更新:OP将要求更改为仅在目标文件存在的情况下追加。 unless块将如下所示:

my $dest_file = File::Spec->catfile($dest_dir, $file);

# only append if destination file exists
if (-f $dest_file ) {
    my $source_file = File::Spec->catfile($source_dir, $file);
    my $content = read_binary($source_file);
    open(my $ofh, '>> :raw :bytes', $dest_file);
    print "Appending contents of ${source_file} to ${dest_file}\n";
    print $ofh $content;
    close($ofh);
}