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命令修改后问题解决。

posted on   wolfsky  阅读(778)  评论(2编辑  收藏  举报

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示