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

时间:2015-08-30 20:47:27

标签: bash

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

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

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

这似乎应该从列表中读取,并且每行都将用户名转换为username@mail.com.pdf。不幸的是,似乎只有最后一个保存到file_names.txt。

第二部分是复制所有文件:

while read p; do
    mv $p foldername
    done <file_names.txt

(我还没有尝试过第二部分,因为第一部分不起作用)。

顺便说一下,我正在和Cygwin一起做这一切。

1)第一个脚本不会复制所有内容有什么问题? 2)如果我开始工作,第二个脚本会正确地复制它们吗? (实际上,我认为如果他们只是被复制,而不是被移动,那更好。

编辑: 我想补充一点,我想出了如何从这里读取txt文件中的行:Looping through content of a file in bash

2 个答案:

答案 0 :(得分:1)

评论解决方案:您的问题是,echo a > b正在覆盖文件,而echo a >> b正在追加到文件,因此请替换

ls | grep $p > file_names.txt

ls | grep $p >> file_names.txt

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

答案 1 :(得分:1)

假设你没有包含换行符的文件名(在这种情况下你的原始方法无论如何都没有机会),试试这个。

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

printf是处理各种issues with ls所必需的;将所有文件名列表一次性传递给grep会产生所有匹配的列表,每行一个;并将其传递给xargs cp执行复制。 (要移动而不是复制,请使用mv而不是cp,两者都支持-t选项,以便在xargs下运行它们。) xargs的函数是将标准输入转换为您作为[{1}}参数运行的程序的参数。