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_1mkdir -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被处理
注意事项
- 操作前建议备份重要文件,或者先在测试目录里验证命令效果,避免误操作
- 两种方法都会保留原目录结构,最终效果完全符合你的预期:
New目录下会复刻原有的子目录,每个子目录里只存放对应的.csv文件 - 如果原目录里的.csv文件被移动后,原目录变成空目录,你可以用
find . -type d -empty -delete命令批量删除空目录(按需执行)
内容的提问来源于stack exchange,提问作者Miguel Herrera Ruiz
相关产品推荐
相关产品推荐

