如何编写bash脚本,根据名称将文件复制到新文件夹中?

如何编写bash脚本,根据名称将文件复制到新文件夹中?,bash,Bash,我有一个文件夹,里面有大约300个文件。它们是以这种形式命名的username@mail.com.pdf. 我需要大约40个,我有一个用户名列表(保存在一个名为names.txt的文件中)。每个用户名在文件中只有一行。我需要大约40个这样的文件,并想复制到一个新的文件夹,其中只有我需要的文件我需要 其中filenames.txt的第一行只有用户名: (例如,eternalmothra),我要复制的PDF文件名为eternalmothra@mail.com.pdf. while read p; d

我有一个文件夹,里面有大约300个文件。它们是以这种形式命名的username@mail.com.pdf. 我需要大约40个,我有一个用户名列表(保存在一个名为names.txt的文件中)。每个用户名在文件中只有一行。我需要大约40个这样的文件,并想复制到一个新的文件夹,其中只有我需要的文件我需要

其中filenames.txt的第一行只有用户名: (例如,eternalmothra),我要复制的PDF文件名为eternalmothra@mail.com.pdf.

while read p; do
  ls | grep $p > file_names.txt
  done <names.txt
读取p时
;做
ls | grep$p>file_names.txt

完成注释中的解决方案:您的问题只是,
echoa>b
正在覆盖文件,而
echoa>>b
正在附加到文件,所以请替换

ls | grep $p > file_names.txt


如果任务每天运行,可能会有更有效的解决方案,但对于300个文件的一次拍摄,您的脚本就很好了。

假设您没有带换行符的文件名(在这种情况下,您最初的方法无论如何都无法工作),请尝试此方法

printf '%s\n' * | grep -f names.txt | xargs cp -t foldername

printf
是解决各种问题所必需的;一次性将所有文件名的列表传递给
grep
,生成所有匹配项的列表,每行一个;并将其传递给
xargs cp
执行复制。(显然,要移动而不是复制,请使用
mv
而不是
cp
;两者都支持
-t
选项,以便在
xargs
下方便地运行它们)
xargs
的功能是将标准输入转换为作为
xargs

参数运行的程序的参数,以便为每次点击覆盖文件。如果您使用
>
而不是
,它应该可以工作,但效率有点低(对于那些小数字来说这不是一个真正的问题)。我不能对评论投赞成票(只有11个声望,低于我在这个问题上最多13个)。如果你想添加它作为答案,那么我会认为它是正确的(我认为即使声誉这么低,我也可以这样做)。当然,正确的解决方案是
xargs-a names.txt cp-t foldername
(或者
mv-t
,如果你真的想移动,但你说你更喜欢复制)。特别是你。在读取-r文件时,比您原来的循环稍微少一些复杂的循环是
;执行cp“$file”文件夹名称;done@tripleee我尝试了这个xargs-a names.txt cp-t foldername,但是我收到了这样的消息:cp:cannot stat'username\r':没有这样的文件或目录,但是我用file_names.txt再次尝试了它,它成功了。我的理解是因为names.txt有“username”,而文件名实际上是“username@mail.com.pdf". 如果没有临时文件,我想我不知道怎么做。
ls | grep $p >> file_names.txt
printf '%s\n' * | grep -f names.txt | xargs cp -t foldername