Как переместить файлы с сервера на компьютер с помощью Perl - PullRequest
0 голосов
/ 24 августа 2018

Я хочу переместить файлы с сервера, к которому подключен мой компьютер с Windows, на настоящий компьютер.Я пробовал код на моем Mac, и он работает нормально, поэтому я подозреваю, что проблема связана с тем, что файлы, которые я хочу переместить, находятся на сервере или, возможно, с Windows (я не знаком с этой ОС).Для меня важно иметь возможность использовать File::Find::Rule, потому что в подкаталогах есть много подкаталогов, которые нужно искать.

use strict;
use warnings;
use File::Find::Rule;
use File::Copy;

# directory where files live
# my $dir = "\\172.18\user\folder\folder2";

# directory where TextGrids will be moved to
my $outdir = "\users\lisa\desktop\test";

my @files;

@files = File::Find::Rule   -> file()
                             -> name("*_clean.TextGrid")
                             -> maxdepth()
                             -> in($dir);

foreach my $file (@files) {
    $file =~ /(.*\\)(.*)/;
    my $name = $2;
    copy("$file", "$outdir/$name") or die "Copy failed: $!";
    }

Редактировать: Хорошо, я внес некоторые изменения в скрипт ниже.Но странно то, что когда я прошу его напечатать каждый файл, он дает мне что-то вроде \\172.18\user\folder\folder/255/file.txt.Я изменил регулярное выражение на (.*\/)(.*) и теперь скрипт работает отлично, хотя я не знаю почему!

use strict;
use warnings;
use File::Find::Rule;
use File::Copy;

# directory where files live
my $dir = "\\\\172.18\\user\\folder\\folder2";

# directory where TextGrids will be moved to
my $outdir = "C:\\Users\\lisa\\desktop\\test";

my @files;

@files = File::Find::Rule   -> file()
                             -> name("*_clean.TextGrid")
                             -> maxdepth()
                             -> in($dir);

foreach my $file (@files) {
    print "$file\n";
    $file =~ /(.*\\)(.*)/;
    my $name = $2;
    copy("$file", "$outdir\\$name") or die "Copy failed: $!";
    }

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

После редактирования скрипт работает, потому что последний разделитель каталогов в строке равен /, что соответствует \/ в регулярном выражении. Несмотря на то, что у вас было \ на входе, библиотека, которую вы использовали для поиска файлов, добавила / s.


У меня есть несколько предложений:

  1. Вы можете избежать необходимости избегать (большей части) обратной косой черты, используя строки в одинарных кавычках, если только вам не требуется интерполяция строк в двойных кавычках.

    Экранирование обратной косой черты не является обязательным, если за ней не следует ни одна кавычка, ни другая обратная косая черта:

    my $outdir = '\users\lisa\desktop\test';
    

    но

    my $outdir = '\users\lisa\desktop\test\\';
    $outdir = '\users\lisa\desktop\test\\\'ere is a path';
    
    my $not_a_path = 'three backslashes\\\\\in between, all but the last need escaping';
    

    'ere is a path - последний элемент на этом пути.

  2. Если вы имеете дело с Windows, рассмотрите возможность использования [\\/] вместо разделителя каталогов в регулярных выражениях. (Или [\\\/], если вам абсолютно необходимо использовать / в качестве разделителя регулярных выражений.)

    Даже если у вас есть контроль над пользовательским вводом для использования только \ в путях, библиотеки, которые вы используете, обычно добавляют /, поэтому лучше подготовиться к комбинации обоих.

    $file =~ /(.*[\\\/])(.*)/;
    $file =~ m{(.*[\\/])(.*)};
    $file =~ m¤(.*[\\/])(.*)¤;
    

Я также удалил лишние кавычки из $file в вызове copy(). Конечный результат:

use strict;
use warnings;
use File::Find::Rule;
use File::Copy;

# directory where files live
my $dir = '\\172.18\user\folder\folder2';

# directory where TextGrids will be moved to
my $outdir = 'C:\Users\lisa\desktop\test';

my @files;

@files = File::Find::Rule   -> file()
                            -> name("*_clean.TextGrid")
                            -> maxdepth()
                            -> in($dir);

foreach my $file (@files) {
    print "$file\n";
    $file =~ /(.*[\\\/])(.*)/;
    my $name = $2;
    copy($file, "$outdir\\$name") or die "Copy failed: $!";
}
0 голосов
/ 24 августа 2018
use strict;
use warnings;

my $dir = "\\172.18\user\folder\folder2";
print("$dir\n");

my $outdir = "\users\lisa\desktop\test";
print("$outdir\n");

выходы

Unrecognized escape \d passed through at a.pl line 7.
\172.18Ser?older?older2
Sersisadesktop  est

Вам необходимо избежать обратной косой черты!

use strict;
use warnings;

my $dir = "\\\\172.18\\user\\folder\\folder2";
print("$dir\n");

my $outdir = "\\users\\lisa\\desktop\\test";
print("$outdir\n");

Не игнорируйте предупреждения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...