2013-06-05 61 views
0

您好我已經編寫了一個perl腳本,它將所有整個目錄結構從源複製到目標,然後我必須創建一個還原腳本perl腳本將撤消perl腳本所做的一切,就是創建一個腳本(shell),它可以使用bash功能將內容從目標恢復到源代碼im努力尋找可遞歸複製的正確函數或命令(而不是要求),但我想完全一樣的結構,因爲它是以前如何從perl腳本創建腳本,它將使用bash功能來複制目錄結構

下面是我試圖創建一個名爲恢復的文件的方式做恢復過程 im特別尋找算法。

而且恢復將結構恢復到一個命令行目錄輸入,如果它被提供,如果不是你可以假設提供給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 = /家庭/ Xubuntu上/用戶

+0

[如何使用perl遞歸複製目錄?](http://stackoverflow.com/questions/227613/how-can-i-copy-a-directory-recursively-and-filter-filenames-in-perl ) – Prix

+0

@Prix問題還涉及如何在shell中包含複製模塊 – dhillon

+0

File :: Copy已經成爲了一段時間的核心模塊。 –

回答

1

首先,我看到你想複製腳本 - 因爲如果你只需要複製文件時,您可以使用:

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

第二,如果你需要複製的子文件夾,您可以使用-r開關,不是嗎?

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

注意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; 

Here-docs中的Perldoc。