0

嗨,我编写了一个 perl 脚本,它将所有整个目录结构从源复制到目标,然后我必须从 perl 脚本创建一个恢复脚本,这将撤消 perl 脚本所做的事情,即创建一个脚本(shell),它可以使用 bash 功能将内容从目标恢复到源我正在努力寻找可以递归复制的正确函数或命令(不是必需的),但我想要与以前完全相同的结构

下面是我试图创建一个名为 restore 的文件来执行恢复过程的方式,我特别在寻找算法。

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

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

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 中的某个变量

但是当我运行 restore as $0 = ./restore $1=/home/xubuntu/User 时,我需要这个来获取命令行输入

4

2 回答 2

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, ...;
}

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

我没有填写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

于 2013-06-05T19:46:53.640 回答
1

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

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

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

于 2013-06-05T19:37:22.147 回答