需求:从含子文件夹目录复制每第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




