如何从perl脚本创建脚本,该脚本将使用bash功能复制目录结构

时间:2013-06-05 19:12:39

标签: perl

您已经编写了一个perl脚本,它将所有整个目录结构从源复制到目标,然后我必须从perl脚本创建一个还原脚本,这将撤消perl脚本所做的创建脚本(shell) )可以使用bash功能将内容从目的地恢复到源我很难找到正确的函数或命令,可以递归复制(不是要求),但我想要与以前完全相同的结构

以下是我尝试创建名为restore的文件以执行恢复过程的方法 我特别想找算法。

如果提供了结构,还可以将结构恢复到命令行目录输入你可以假设提供给perl脚本的默认输入 $源 目标$ 在这种情况下,我们希望从目标复制到源

所以我们在一个脚本中有两个不同的部分。

1将从源复制到目的地。

2它将创建一个脚本文件,该文件将撤消第1部分的操作 我希望这很清楚

 unless(open FILE, '>'."$source/$file") 
 {

    # Die with error message 
    # if we can't open it.
    die "\nUnable to create $file\n";
  }

    # Write some text to the file.

    print FILE "#!/bin/sh\n";
    print FILE "$1=$target;\n";
    print FILE "cp -r \n";

    # close the file.
     close FILE;

    # here we change the permissions of the file
      chmod 0755, "$source/$file";

我遇到的最后一个问题是我在恢复文件中无法获得1美元,因为它引用了perl中的某个变量

但是当我以$ 0 = ./restore $ 1 = / home / xubuntu / User

运行还原时,我需要这个来获取命令行输入

2 个答案:

答案 0 :(得分:3)

首先,Perl的标准方法是:

 unless(open FILE, '>'."$source/$file") {
    die "\nUnable to create $file\n";
 }

是使用or语句:

open my $file_fh, ">", "$source/$file" 
    or die "Unable to create "$file"";

这更容易理解。

更现代的方式是use autodie;,它可以在打开或写入文件时处理所有IO问题。

use strict;
use warnings;
use autodie;

open my $file_fh, '>', "$source/$file";

您应该查看Perl模块File::FindFile::BasenameFile::Copy来复制文件和目录:

use File::Find;
use File::Basename;

my @file_list;
find ( sub {
          return unless -f;
          push @file_list, $File::Find::name;
     },
 $directory );

现在,@file_list将包含$directory中的所有文件。

for my $file ( @file_list ) {
    my $directory = dirname $file;
    mkdir $directory unless -d $directory;
    copy $file, ...;
}

请注意,如果mkdircopy命令失败, autodie 也会终止您的程序。

我没有填写copy命令,因为您要复制的位置和方式可能有所不同。您也可以选择use File::Copy qw(cp);,然后在程序中使用cp代替copycopy命令将创建具有默认权限的文件,而cp命令将复制权限。

您没有解释为什么要使用bash shell命令。我怀疑你想将它用于目录副本,但你仍然可以在Perl中做到这一点。如果您仍需要创建shell脚本,最简单的方法是通过:

print {$file_fh} << END_OF_SHELL_SCRIPT;
Your shell script goes here
and it can contain as many lines as you need.
Since there are no quotes around `END_OF_SHELL_SCRIPT`,
Perl variables will be interpolated
This is the last line. The END_OF_SHELL_SCRIPT marks the end
END_OF_SHELL_SCRIPT

close $file_fh;

请参阅Perldoc中的Here-docs

答案 1 :(得分:1)

首先,我看到你想制作一个复制脚本 - 因为如果你只需要复制文件,你可以使用:

system("cp -r /sourcepath /targetpath");

其次,如果你需要复制子文件夹,可以使用-r switch,不是吗?