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

Linux:如何移动文件并保留原目录结构(替代cp --parents的移动方案)

解决方案:移动CSV文件并保留目录结构

没问题,我来帮你搞定这个需求——把所有.csv文件移动到New目录下,同时完整保留原有的目录树结构。下面是两种可靠的方法,你可以根据自己的系统环境选择:

方法一:用find + mkdir + mv(通用所有Unix-like系统)

在你的myDir目录下打开终端,执行以下命令:

find . -type f -name "*.csv" -exec sh -c '
  for file do
    # 构建目标目录路径:在New下复刻原文件的父目录
    target_dir="./New/${file%/*}"
    # 递归创建目标目录(不存在的父目录会自动创建)
    mkdir -p "$target_dir"
    # 移动文件到目标目录
    mv "$file" "$target_dir"
  done
' sh {} +

命令拆解:

  • find . -type f -name "*.csv":从当前目录(myDir)开始,递归查找所有后缀为.csv的普通文件
  • -exec sh -c '...' sh {} +:把找到的所有文件批量传给后面的shell脚本处理
  • ${file%/*}:这是Shell参数扩展,用来去掉文件路径的最后一部分(即文件名),只保留父目录路径。比如./Folder_1/file_2.csv会被处理成./Folder_1
  • mkdir -p "$target_dir":-p参数确保如果目标目录不存在(包括其父目录),会递归创建,不会抛出错误
  • mv "$file" "$target_dir":把原文件移动到对应目标目录

👉 测试建议:执行前可以把mv改成echo mv,这样会先输出所有要执行的移动命令,确认没问题后再换成真实的mv。


方法二:用rsync(更简洁,需系统安装rsync)

如果你的系统已经安装了rsync(大多数Linux发行版和macOS默认都有),可以用更简洁的命令实现:

rsync -av --remove-source-files --include='*/' --include='*.csv' --exclude='*' ./ ./New/

参数说明:

  • -av:a是归档模式(保留文件权限、时间戳等属性),v是详细输出(方便查看执行过程)
  • --remove-source-files:同步完成后删除源文件(注意:只会删除被同步的.csv文件,不会删除空目录)
  • --include='*/':必须先包含所有子目录,否则rsync无法遍历深层目录里的.csv文件
  • --include='*.csv':明确包含所有.csv文件
  • --exclude='*':排除其他所有类型的文件,确保只有.csv被处理

注意事项

  1. 操作前建议备份重要文件,或者先在测试目录里验证命令效果,避免误操作
  2. 两种方法都会保留原目录结构,最终效果完全符合你的预期:New目录下会复刻原有的子目录,每个子目录里只存放对应的.csv文件
  3. 如果原目录里的.csv文件被移动后,原目录变成空目录,你可以用find . -type d -empty -delete命令批量删除空目录(按需执行)

内容的提问来源于stack exchange,提问作者Miguel Herrera Ruiz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 08:17:36