首页 > 解决方案 > 如何使用 perl 将文件从服务器移动到计算机

问题描述

我想将文件从我的 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: $!";
    }

标签: windowsperl

解决方案


编辑后,脚本可以正常工作,因为字符串中的最后一个目录分隔符恰好是/,它与\/正则表达式中的 匹配。即使您\在输入中添加了用于查找文件的库,也添加了/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: $!";
}

推荐阅读