Linux 的 cp 命令本身不支持按文件后缀过滤复制,必须借助 shell 通配符(如 cp .c /dest/)、find(如 find ./src -name ".h" -o -name ".c" -exec cp -t /dest/ {} +)或 rsync(如 rsync -av --include="/" --include=".c" --exclude="" ./src/ /dest/)等外部机制实现。

Linux 的 cp 命令本身不支持按文件后缀过滤复制,它没有内置的通配符匹配或扩展名筛选逻辑。所谓“只复制 .c 或 .py 文件”,必须借助 shell 的通配机制、命令组合或外部工具来实现。
用 shell 通配符配合 cp(最常用)
在目标目录存在且路径不含空格的前提下,可直接使用 * 和扩展名匹配:
-
cp *.c /dest/—— 复制当前目录所有.c文件到/dest/ -
cp *.py *.md README* /dest/—— 同时匹配多种模式(注意:最后一个参数必须是已存在的目录) - 若需递归查找并复制(比如整个项目里所有
.js),不能单靠cp,得结合find
用 find + cp 实现深度过滤复制
当需要从子目录中提取特定后缀文件(如 src/ 下所有 .h 和 .c),推荐:
find ./src -name "*.h" -o -name "*.c" -exec cp {} /dest/ \;- 更安全写法(避免空结果报错):
find ./src \( -name "*.h" -o -name "*.c" \) -type f -exec cp -t /dest/ {} +
(-t /dest/确保目标目录前置,{} +提升执行效率)
用 rsync 按规则筛选(适合复杂场景)
rsync 支持 include/exclude 规则,更适合构建源码分发包:
rsync -av --include="*/" --include="*.c" --include="*.h" --exclude="*" ./src/ /dest/- 含义:进入所有目录(
--include="*/"),保留.c和.h文件,其余全部排除 - 优势:支持相对路径、软链接处理、增量同步,比纯
cp更可控
注意事项
这些方法都不是 cp 自身的功能延伸,而是利用 Shell 展开或管道协作完成的:
- 通配符由 shell 解析,不是
cp解析;如果当前目录无匹配文件,某些 shell 会原样传入*.c导致报错(可用shopt -s nullglob避免) -
cp不识别--include或正则,别尝试cp --pattern="*.go"这类不存在的选项 - 复制目录时记得加
-r;但过滤文件时通常只操作普通文件,无需递归选项


















