我的文件夹里装满了~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
答案 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}}参数运行的程序的参数。