Perl教程:如何仅复制目录结构而不包含文件?
复制目录结构(不含文件)的Perl实现
你不需要非得用File::Find配合rmdir,有更直接的方案可选:
1. 用核心模块File::Path + File::Find直接创建目录结构
这是最高效的方式,不需要复制文件再清理,直接遍历源目录的结构并在目标路径创建对应目录。File::Path是Perl核心模块,无需额外安装:
use strict; use warnings; use File::Find; use File::Path qw(make_path); my $source = 'C:/dir_source'; my $target = 'C:/dir_target'; # 遍历源目录下的所有子目录 find(sub { # 只处理目录项 return unless -d; # 计算当前目录相对于源目录的路径 my $relative_path = $File::Find::name; $relative_path =~ s/^\Q$source\E//; # 跳过源目录本身 return if $relative_path eq ''; # 拼接目标目录路径并创建 my $target_dir = "$target/$relative_path"; make_path($target_dir) or die "无法创建目录 $target_dir: $!"; }, $source);
2. 若坚持用File::Copy::Recursive:先复制再删除文件
如果一定要用dircopy,可以先完整复制目录结构,再遍历目标目录删除所有文件。但这种方式在源目录文件较多时效率较低:
use strict; use warnings; use File::Copy::Recursive qw(dircopy); use File::Find; my $source = 'C:/dir_source'; my $target = 'C:/dir_target'; # 复制整个目录结构(含文件) dircopy($source, $target) or die "复制目录失败: $!"; # 遍历目标目录,删除所有文件 find(sub { # 只处理文件项 return if -d; unlink $_ or die "无法删除文件 $_: $!"; }, $target);
关于finddepth的方案
用finddepth替代find也是可行的,它会从最深层的子目录开始遍历,但对于创建目录的需求来说,和普通find的效果几乎一致,只是遍历顺序不同:
use strict; use warnings; use File::Find qw(finddepth); use File::Path qw(make_path); my $source = 'C:/dir_source'; my $target = 'C:/dir_target'; finddepth(sub { return unless -d; my $relative_path = $File::Find::name; $relative_path =~ s/^\Q$source\E//; return if $relative_path eq ''; my $target_dir = "$target/$relative_path"; make_path($target_dir) or die "无法创建目录 $target_dir: $!"; }, $source);
内容的提问来源于stack exchange,提问作者giordano
相关产品推荐
相关产品推荐

