Mac Terminal下如何复制包含指定扩展名文件的目录?
解决方法:找到含指定扩展名文件的目录并复制到目标位置
这个需求其实很常见,你已经用find找到了包含.jpg文件的目录,接下来只需要解决去重和批量复制的问题就行,用rsync是最优选择(比cp更高效,还能完整保留文件属性),下面给你详细的实现方案:
基础版(适合无特殊字符的目录)
如果你的目录名里没有空格、引号这类特殊字符,可以用这个简单的命令:
find . -iname '*.jpg' -exec dirname {} \; | sort -u | xargs -I {} rsync -a {} /path/to/your/destination/
各部分作用:
find . -iname '*.jpg' -exec dirname {} \;:递归查找当前目录下所有.jpg文件(-iname不区分大小写),并提取每个文件所在的目录。sort -u:对目录路径去重(因为同一个目录里可能有多个.jpg,find会重复输出该目录)。xargs -I {} rsync -a {} /path/to/your/destination/:把每个去重后的目录作为参数,用rsync的归档模式(-a)复制到目标位置。-a会保留文件的权限、修改时间、所有者等属性,相当于做了完整备份。
进阶版(支持含空格/特殊字符的目录)
Mac系统里经常会遇到带空格的目录(比如My Vacation Photos),上面的命令会出错,这时候需要用null字符分隔路径来避免问题:
find . -iname '*.jpg' -print0 | xargs -0 dirname | sort -u | xargs -0 -I {} rsync -a {} /path/to/your/destination/
关键改进:
-print0:让find用null字符而不是换行符分隔结果,避免空格截断路径。xargs -0:告诉xargs用null字符作为分隔符,正确识别带特殊字符的目录名。
保留原相对路径(可选)
如果你希望复制后保留原目录的层级结构(比如原目录是./2023/Summer/Photos,复制到目标后变成/destination/2023/Summer/Photos),可以加上rsync的--relative选项:
find . -iname '*.jpg' -print0 | xargs -0 dirname | sort -u | xargs -0 -I {} rsync -a --relative {} /path/to/your/destination/
先测试再执行(避免误操作)
在实际复制前,建议先把rsync换成echo,确认找到的目录是否正确:
find . -iname '*.jpg' -print0 | xargs -0 dirname | sort -u | xargs -0 -I {} echo {}
输出的目录列表符合预期后,再替换回rsync执行复制即可。
内容的提问来源于stack exchange,提问作者Dominik Novák
相关产品推荐
相关产品推荐

