Linux从文件中逐行读取文件名并将匹配的文件复制到指定目录
问题应该算挺常见的但是一句话还挺难说清楚,所以百度特别难搜。
场景就是,有一堆以员工名称命名的文件(名称可能还有字母数字等前后缀),现在给定一个员工清单,需要从这些文件中筛选出员工清单上列出的员工的文件,并复制到另外一个目录中。
输入:
1. 许多文件名包含员工名称的文件
2.一个清单文件,里面包含需要筛选的员工列表,每个员工名称一行
输出:
1.在清单上的员工的文件
研究了一下,需要综合使用awk、find、cp命令
awk用于逐行的处理清单文件,find用于文件名匹配,cp命令用于文件复制
命令如下:
awk -F '/' '{print "*"$NF"*"}' name.txt | sort | uniq | xargs -i find . -name {} | xargs cp -t ./output
print命令用于把输出要匹配的文件名打印到管道中,使用"*"来拼接字符串来模糊匹配
因为是在Windows中用cygwin模拟的,源文件都是Windows里面的文件,所以在处理的过程中遇到了一些兼容问题,比如:
1. 源文件name.txt的编码和特殊符号的问题,Windows默认文本文件保存为GB2312编码,在Linux环境中处理后变成乱码,修改为UTF-8后问题解决。Windows默认的换行符是CRLF,Linux默认的换行符是LF,Windows格式在处理的时候后缀的*号无法正常拼接,换成Linux的换行符后问题解决。
2. 上面的命令复制出的文件默认没有权限,在Windows中打不开,使用chmod命令修改后问题解决。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!