MacBook Pro下用Bash命令迁移指定后缀文件并保留目录结构
嘿,针对你在MacBook Pro上用Bash迁移.json文件的需求,我给你两个实用方案,都是经过验证的靠谱操作~
方案1:用rsync(推荐,简洁高效)
rsync是处理文件同步/迁移的神器,这条命令完全符合你的需求,而且操作起来特别省心:
rsync -av --include='*/' --include='*.json' --exclude='*' /dir1/ /dir2/
参数说明:
-a:归档模式,会保留文件的权限、时间戳等属性,同时自动递归处理所有子目录-v:verbose模式,会显示每一步的操作细节,方便你确认进度和排查问题--include='*/':先包含所有子目录结构,这样rsync才能遍历到深层文件夹里的.json文件--include='*.json':明确指定要包含所有后缀为.json的文件--exclude='*':排除所有其他类型的文件和目录,确保只有.json文件被处理/dir1/:注意路径末尾的斜杠,代表同步/dir1内部的内容,而不是把/dir1目录本身搬到/dir2/dir2/:目标目录,rsync会自动创建不存在的子目录,完全保留原有的目录结构
这个命令的效果:只会把/dir1里的所有.json文件迁移到/dir2对应的路径下,/dir2中原有的文件会被完整保留,非.json文件完全不会被触碰。
方案2:用find + mv(手动控制更精细)
如果你想要更精细的手动控制,比如随时调整逻辑,可以用find配合mv来实现:
find /dir1 -type f -name "*.json" | while read -r file; do # 将源文件路径中的/dir1替换为/dir2,得到目标文件路径 target_file="${file//\/dir1\//\/dir2\/}" # 创建目标文件所在的目录(如果不存在则递归创建) mkdir -p "$(dirname "$target_file")" # 移动文件,-n参数确保不覆盖目标目录已存在的同名.json文件 mv -n "$file" "$target_file" done
关键步骤解释:
find /dir1 -type f -name "*.json":遍历/dir1下所有后缀为.json的普通文件(排除目录)while read -r file:逐个读取找到的文件路径,避免文件名含空格等特殊字符出问题target_file="${file//\/dir1\//\/dir2\/}":通过字符串替换,把源路径里的/dir1替换成/dir2,自动生成对应的目标路径mkdir -p "$(dirname "$target_file")":-p参数会自动创建所有不存在的父目录,比如/dir2/a/b/c如果不存在,会一次性创建完整路径mv -n "$file" "$target_file":-n参数是核心,它会跳过已经存在的目标文件,确保/dir2里原有的文件不会被覆盖
小提示:
- 建议先做测试:比如给
rsync加--dry-run参数(rsync -av --dry-run ...),或者把mv换成echo mv,先看看输出的操作是否符合预期,避免误操作 - 权限问题:确保你对
/dir1有读取权限,对/dir2有写入权限,否则会报错
内容的提问来源于stack exchange,提问作者Javiss
相关产品推荐
相关产品推荐

