问题应该算挺常见的但是一句话还挺难说清楚,所以百度特别难搜。

场景就是,有一堆以员工名称命名的文件(名称可能还有字母数字等前后缀),现在给定一个员工清单,需要从这些文件中筛选出员工清单上列出的员工的文件,并复制到另外一个目录中。

输入:

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