You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 06:42:47