如何将指定目录下的子目录内容同步至已有同名目录的目标路径?
解决目录内容更新复制的问题
你的当前命令会将/home/ab/abc下的每个dir*目录整体复制到/home/ab/xyz中,导致目标目录下出现xyz/dir1/dir1这类嵌套结构,不符合“更新已有子目录内容”的需求。
正确的实现方式
根据你的目录结构和需求,有两种简洁的解决方案:
方案1:直接复制(适用于源目录仅一级dir*子目录的情况)
因为你的abc目录下只有一级dir1、dir2子目录,无需递归查找,直接用以下命令即可:
cp -r /home/ab/abc/dir*/* /home/ab/xyz/
-r:递归复制目录及所有层级的内容dir*/*:匹配所有dir开头目录下的全部内容,直接映射到目标目录的对应子目录(比如abc/dir1/file.txt会被同步到xyz/dir1/file.txt)
如果需要仅更新源文件比目标文件新的内容(避免重复复制无变化的文件),添加-u选项:
cp -ru /home/ab/abc/dir*/* /home/ab/xyz/
方案2:递归查找(适用于存在多级dir*子目录的情况)
如果后续abc目录下会出现更深层级的dir*子目录,用find配合shell命令实现精准同步:
find /home/ab/abc -type d -name "dir*" -exec sh -c ' target_dir="/home/ab/xyz/$(basename "$1")" cp -r "$1"/* "$target_dir/" ' _ {} \;
find /home/ab/abc -type d -name "dir*":递归遍历所有以dir开头的目录basename "$1":提取当前找到的目录的名称(比如从/home/ab/abc/dir1中提取dir1)cp -r "$1"/* "$target_dir/":将源目录下的所有内容复制到目标的对应子目录,实现内容更新
验证结果
执行命令后,可通过以下命令确认同步效果:
ls -l /home/ab/xyz/dir1 ls -l /home/ab/xyz/dir2
确认源目录的内容已同步到目标目录的对应子目录,且没有出现嵌套目录结构。
内容的提问来源于stack exchange,提问作者Divyank
相关产品推荐
相关产品推荐

