您已经编写了一个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
运行还原时,我需要这个来获取命令行输入答案 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::Find,File::Basename和File::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, ...;
}
请注意,如果mkdir
或copy
命令失败, autodie 也会终止您的程序。
我没有填写copy
命令,因为您要复制的位置和方式可能有所不同。您也可以选择use File::Copy qw(cp);
,然后在程序中使用cp
代替copy
。 copy
命令将创建具有默认权限的文件,而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,不是吗?