You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

需求:从含子文件夹目录复制每第n个文件并保留目录结构

我来帮你搞定这个需求!要实现按间隔选取第n个文件并保留原目录结构复制,核心就是补上「同步创建目标子目录」这一步——之前的方案大概率是直接把符合条件的文件丢到目标根目录,忽略了原路径的层级。下面给你两种实用的实现方案:

方案1:Bash Shell脚本(Linux/macOS 适用)

这个脚本用find遍历原目录的所有文件,按路径排序保证选取顺序稳定,再筛选出每第n个文件,最后自动创建对应子目录并复制:

# 配置参数
SOURCE_DIR="/path/to/your/source/directory"
TARGET_DIR="/path/to/your/target/directory"
N=3  # 每第3个文件,可根据需求修改

# 遍历并筛选文件,保留目录结构复制
find "$SOURCE_DIR" -type f | sort | awk "NR % $N == 0" | while read -r FILE; do
    # 计算目标文件路径:替换原目录为目标目录
    TARGET_FILE="${FILE/$SOURCE_DIR/$TARGET_DIR}"
    # 创建目标文件所在的子目录(如果不存在)
    mkdir -p "$(dirname "$TARGET_FILE")"
    # 复制文件
    cp "$FILE" "$TARGET_FILE"
done

说明:

  • find "$SOURCE_DIR" -type f:遍历原目录下所有普通文件(排除目录)
  • sort:保证文件按路径顺序排列,避免随机选取
  • awk "NR % $N == 0":筛选出行号(对应文件顺序)能被N整除的文件(如果要从第1个开始取第1、4、7...,改成NR % $N == 1即可)
  • mkdir -p "$(dirname "$TARGET_FILE")":自动创建目标文件所需的所有层级子目录,这就是保留结构的关键
方案2:Python脚本(跨平台,Windows/Linux/macOS 通用)

如果需要跨平台运行,Python脚本会更稳妥,逻辑和Shell类似,但兼容性更好:

import os
import shutil

# 配置参数
source_dir = "/path/to/your/source/directory"
target_dir = "/path/to/your/target/directory"
n = 3  # 每第3个文件,可修改

# 遍历原目录的所有子目录
for root, dirs, files in os.walk(source_dir):
    # 对当前目录下的文件按名称排序(保证选取顺序稳定)
    sorted_files = sorted(files)
    # 筛选每第n个文件(索引从0开始,所以取(i + 1) % n == 0对应第n个、第2n个...)
    selected_files = [f for i, f in enumerate(sorted_files) if (i + 1) % n == 0]
    
    # 计算当前目录对应的目标子目录路径
    relative_path = os.path.relpath(root, source_dir)
    target_subdir = os.path.join(target_dir, relative_path)
    
    # 创建目标子目录(如果不存在)
    os.makedirs(target_subdir, exist_ok=True)
    
    # 复制选中的文件到目标子目录
    for file in selected_files:
        source_file = os.path.join(root, file)
        target_file = os.path.join(target_subdir, file)
        shutil.copy2(source_file, target_file)

说明:

  • os.walk(source_dir):递归遍历原目录的所有层级,返回当前目录、子目录列表、文件列表
  • sorted(files):按文件名排序,避免不同系统下的遍历顺序差异
  • (i + 1) % n == 0:这里把索引从0转为从1开始计数,这样第n、2n...个文件会被选中;如果要从第1个开始取,改成i % n == 0即可
  • shutil.copy2:相比shutil.copy会保留文件的元数据(比如创建时间、修改时间),更贴近原文件属性

内容的提问来源于stack exchange,提问作者Dont-Fight-The-Future

火山引擎 最新活动