我是 perl noob,并尝试执行以下操作:
- 递归搜索目录中具有特定字符串的文件。说字符串是'abc.txt'
- 该文件可以位于两个不同的子目录中,例如 dir_1 或 dir_2
- 找到文件后,如果在 dir_1 中找到,则将其重命名为 dir_1_abc.txt。如果它在 dir_2 中,则将其重命名为 dir_2_abc.txt。
- 找到并重命名所有文件后,将它们全部移动到名为 dir_3 的新目录
我不在乎是否必须使用任何模块来完成此操作。我一直在尝试使用 File::Find::Rule 和 File::copy 来做到这一点,但没有得到想要的结果。这是我的示例代码:
#!/usr/bin/perl -sl
use strict;
use warnings;
use File::Find::Rule;
use File::Copy;
my $dir1 = '/Users/macuser/ParentDirectory/logs/dir_1'
my $dir2 = '/Users/macuser/ParentDirectory/logs/dir_2'
#ideally I just want to define one directory but because of the logic I am using in IF
#statement, I am specifying two different directory paths
my $dest_dir = '/Users/macuser/dir_3';
my(@old_files) = find(
file => (),
name => '*abc.txt',
in => $dir1, $dir2 ); #not sure if I can give two directories, works with on
foreach my $old_file(@old_files) {
print $old_file; #added this for debug
if ($dest_dir =~ m/dir_1/)
{
print "yes in the loop";
rename ($old_file, "dir_1_$old_file");
print $old_file;
copy "$old_file", "$dest_dir";
}
if ($dest_dir =~ m/dir_2/)
{
print "yes in the loop";
rename ($old_file, "dir_2_$old_file");
print $old_file;
copy "$old_file", "dest_dir";
}
}
上面的代码不会更改文件名,而是当我在 if 中打印 $old_file 时,它会吐出找到文件的整个目录路径,并且分别在路径前加上 dir_1 和 dir_2。有什么大错特错。请简单地帮忙。