windows - 如何使用 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: $!";
}
解决方案
编辑后,脚本可以正常工作,因为字符串中的最后一个目录分隔符恰好是/
,它与\/
正则表达式中的 匹配。即使您\
在输入中添加了用于查找文件的库,也添加了/
s.
我有一些建议:
您可以通过使用单引号字符串来避免转义(大多数)反斜杠,除非您需要对双引号字符串进行插值。
除非后跟单引号或另一个反斜杠,否则转义反斜杠是可选的:
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
是该路径中的最后一个元素。如果您使用的是 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: $!";
}
推荐阅读
- javascript - 如何将键值对数组转换为以第一个数组的值作为键的对象?
- odoo - 如何在 Odoo 11 Enterprise 中为选定帐户设置“管理数据库”按钮?
- loops - 超出内存限制 - Python
- flatpickr - Flatpickr 时间格式操作
- regex - Bash if 语句检查 1 个字母和 2 个数字
- cryptography - 使用椭圆曲线密码术使用公钥加密并使用私钥解密
- python - ModuleNotFoundError:没有名为“requests_html”的模块
- dependency-management - 如何在 ivy 中调整版本分辨率
- sql - 如何从包含两个文本字符串的一列中检索一个文本字符串?
- string - Bash 字符串重定向到标准输入:删除换行符