Создание папки с использованием Perl - PullRequest
4 голосов
/ 11 мая 2011

Я хочу создать папку, используя perl, где в той же папке существует сценарий perl. Я создал FolderCreator.pl, который требует входной параметр folder name.

unless(chdir($ARGV[0]){ # If the dir available change current , unless
    mkdir($ARGV[0], 0700);                             # Create a directory
    chdir($ARGV[0]) or die "can't chdir $ARGV[0]\n";    # Then change or stop
}

Это работало нормально только если мы вызываем scipt, в той же папке, где он находится Если он вызывается в другой папке, если не работает.

Например.

.../Scripts/ScriptContainFolder> perl FolderCreator.pl New
.../Scripts> perl ./ScriptContainFolder/FolderCreator.pl New

Первый работает нормально, а второй нет. Есть ли способ создать эти папки?

Ответы [ 3 ]

6 голосов
/ 11 мая 2011

Вы можете использовать модуль FindBin , который дает нам переменную $ Bin. Он находит полный путь к каталогу bin скрипта, чтобы разрешить использование путей относительно каталога bin.

use FindBin qw($Bin);

my $folder = "$Bin/$ARGV[0]";

mkdir($folder, 0700) unless(-d $folder );
chdir($folder) or die "can't chdir $folder\n";
4 голосов
/ 11 мая 2011

Я думаю, что это работает точно так, как написано, за исключением того, что у вас есть опечатка, а именно отсутствует закрывающая скобка вокруг chdir.

unless(chdir($ARGV[0])) {   #fixed typo
    mkdir($ARGV[0], 0700);
    chdir($ARGV[0]) or die "can't chdir $ARGV[0]\n";
}

Сценарий работает так:

  1. Если скрипт не может перевести chdir в $ ARGV [0] то:
  2. Создайте каталог $ ARGV [0], с маска разрешения 0700.
  3. Изменить рабочий каталог на $ ARGV [0] или выйдите из сценария с текст ошибки "cant chdir ..".

Начальным каталогом для скрипта будет каталог, из которого он вызывается, каким бы он ни был. На * nix это будет переменная $ENV{PWD} внутри вашего скрипта. Он создаст новую папку в любой папке, для которой у него есть разрешение.

Я думаю, что это поведение логично, и так и должно быть. Если вы хотите, чтобы ваш пример работал, сделайте следующее:

.../Scripts> perl ./ScriptContainFolder/FolderCreator.pl ScriptContainFolder/New

Вы также можете использовать абсолютный путь, например

?> FolderCreator.pl /home/m/me/Scripts/ScriptContainFolder/New

ETA: О, и вы, конечно, всегда должны всегда включать это в свои сценарии, независимо от того, насколько они малы:

use strict;
use warnings;
1 голос
/ 12 мая 2011

Я сделал работу, и вот код ... Спасибо всем за помощь ...

#!usr/bin/perl

###########################################################################################
# Needed variables
use File::Path;
use Cwd 'abs_path';
my $folName     = $ARGV[0];
#############################################################################################
# Flow Sequence 
if(length($folName) > 0){
    # changing current directory to the script resides dir
    $path = abs_path($0);
    $path = substr($path, 0, index($path,'FolderCreator.pl') );
    $pwd = `pwd`;
    chop($pwd);
    $index = index($path,$pwd);
    if( index($path,$pwd) == 0 ) {
        $length = length($pwd);
        $path = substr($path, $length+1);

        $index = index($path,'/');
        while( $index != -1){
            $nxtfol = substr($path, 0, $index);
            chdir($nxtfol) or die "Unable to change dir : $nxtfol"; 
            $path = substr($path, $index+1);
            $index = index($path,'/');
        } 
    }
    # dir changing done...

    # creation of dir starts here
    unless(chdir($folName)){        # If the dir available change current , unless
        mkdir("$USER_ID", 0700);    # Create a directory
        chdir($folName) or $succode = 3;    # Then change or stop
    }
}
else {
    print "Usage : <FOLDER_NAME>\n";    
}
exit 0;
...