我想搜索然后复制文本文件中所有文件名匹配的文件,这些文件从服务器上的目录(包含子目录)复制到另一个目录。我找到了一个适用于 Windows 的很棒的解决方案(虽然速度很慢)这里。
在 .bat 文件中,类似如下内容:
for /f "delims=" %%i in (text-list.txt) do echo D|xcopy "\\SERVER\FOLDER\%%i?" "c:\temp" /i /z /y /s
我如何在 Mac/Linux 上实现这一点?
这适用于位于同一目录中的文件,但我不知道如何在源文件夹中搜索子目录:
rsync --files-from ~/filelist.txt . ~/destfolder
根据@neofug 的示例,这是一个执行此操作的 perl 脚本。它运行良好,只是它不会搜索 srcfolder 中的子文件夹:
#!/usr/bin/env perl
use strict;
my $textFile = shift @ARGV;
my $filenames = {};
open F1, "<", $textFile or die "Cannot open file $textFile! $!\n";
while ( <F1> ){
chomp;
$filenames->{$_}++;
}
close(F1);
my $imgDir = "/Users/username/srcfolder";
chdir($imgDir);
my @imgList = glob "*.txt";
foreach(@imgList){
if($filenames->{$_}){
system("/bin/cp $_ /Users/username/destfolder");
}
}
答案1
您可以我们perl为了实现此目的,请输入文本文件列表作为命令行参数并更改路径以适合您的设置:
#!/usr/bin/env perl
use strict;
use File::Find;
my $textFile = shift @ARGV;
my $filenames = {};
open F1, "<", $textFile or die "Cannot open file $textFile! $!\n";
while ( <F1> ){
chomp;
$filenames->{$_}++;
}
close(F1);
my $imgDir = "/home/user/Pictures/";
my $imgList = {};
find(\&findPics, "/home/user/Pictures/");
foreach(keys %$imgList){
if($filenames->{$_}){
system("/bin/cp $imgList->{$_} /path/to/newImages/");
}
}
sub findPics{
if($_ =~ /.+[jpg|jpeg|png|gif]/i){
$imgList->{$_} = $File::Find::name;
}
}
编辑:我根据 op 的要求修改了这个程序,以便在给定的目录中递归查找所有图像。