Bash中从多级子目录复制.fq.gz文件失败求助
问题原因及解决方法
错误原因
你用的ls -R | grep "\.fq.gz"只会提取文件名,丢失了文件所在的子目录路径。比如subfolder1里的a.fq.gz,grep出来的只有a.fq.gz,但你在当前目录执行cp时,找不到这个文件,自然报错。
正确解决方案
方法1:用find命令(最推荐,稳定可靠)
直接用find递归搜索并复制,它会保留完整的文件路径:
find dir -type f -name "*.fq.gz" -exec cp {} "$destination" \;
参数说明:
dir:要搜索的根目录(即你目录结构里的那个dir)-type f:只匹配普通文件,排除目录-name "*.fq.gz":精准筛选后缀为.fq.gz的文件-exec cp {} "$destination" \;:对每个找到的文件执行复制操作,{}代表找到的完整文件路径
方法2:配合xargs提高效率(适合大量文件)
如果文件数量很多,用xargs可以减少cp的调用次数,提升效率:
find dir -type f -name "*.fq.gz" -print0 | xargs -0 cp -t "$destination"
参数说明:
-print0和-0:处理文件名含空格、特殊字符的情况,避免执行出错cp -t "$destination":指定目标目录,让xargs把所有找到的文件一次性传给cp
额外注意事项
- 先确认目标目录存在,不存在的话先创建:
mkdir -p "$destination" - 如果担心重名文件被覆盖,可以给
cp加-n参数(不覆盖已存在的文件),或者-b参数(给被覆盖的文件创建备份):find dir -type f -name "*.fq.gz" -exec cp -n {} "$destination" \;
内容的提问来源于stack exchange,提问作者Corrector
相关产品推荐
相关产品推荐

