与模式匹配的grep文件名并移动到所需的文件夹

时间:2012-12-18 07:13:12

标签: linux bash shell grep move

我在.txt文件中有一个模式列表。 [LIST.TXT]。 list.txt中的Foreach行,我想在list.txt中以指定模式开头的位置找到所有文件,然后将这些文件移动到另一个位置。 考虑一个示例案例。

~/home/ana/folder_a我有list.txt,看起来像这样......

LIST.TXT

1abc
2def
3xyz

在这个位置,即/home/ana/folder_a/,有多个文件以list.txt中的模式开头。所以,有一些文件,如1abc_a.txt,1abc_c.txt,1abc_f.txt,2def_g.txt,3xyz_a.txt

所以我想要实现的是:

for i in cat list.txt; do 
  ls | grep '^$i' [thats the pattern] | 
  mv [files containing the pattern] to /home/ana/folder_b/

请注意,在另一个位置,即/ home / ana / folder_b /我已经创建了特定于每个模式的目录。

所以/ home / ana / folder_b /包含子目录,如1abc /,2def /,3xyz / 实际上,我希望将/ home / ana / folder_a /中匹配模式'1abc','2def'和'3xyz'的所有文件移动到/ home / ana / folder_b /中它们各自的子目录,这样/ home / ana / folder_b / 1abc将包含1abc_a.txt,1abc_c.txt和1abc_f.txt; / home / ana / folder_b / 2def /将有2def_g.txt和/ home / ana / folder_b / 3xyz /将有3xyz_a.txt

3 个答案:

答案 0 :(得分:2)

Grep的-f选项与文件中的模式匹配,因此您无需在shell中的文件中的每一行循环:

$ ls                              # List all files in dir, some match, some don't
1abc_a.txt 1abc_c.txt 1abc_f.txt  2def_g.txt 3xyz_a.txt file1 file2 list.txt

$ cat list.txt                    # List patterns to match against 
1abc
2def
3xyz

$ ls | grep -f list.txt           # grep for files that only match pattern
1abc_a.txt
1abc_c.txt
1abc_f.txt
2def_g.txt
3xyz_a.txt

管道到xargs进行移动:

ls | grep -f list.txt | xargs -i -t mv {} ../folder_B
mv 1abc_a.txt ../folderB 
mv 1abc_c.txt ../folderB 
mv 1abc_f.txt ../folderB 
mv 2def_g.txt ../folderB 
mv 3xyz_a.txt ../folderB 

编辑:已实现我错过了问题的子目录部分,@ Thor的答案是最好的方法,但我认为你可能会从这个答案中找到一些用处。

答案 1 :(得分:1)

我认为全球扩张是这里的方式:

while read pattern; do
  mv "${pattern}"* ../folder_b/"$pattern"
done < list.txt

echo命令前面的mv开始,当您对输出感到满意时将其删除。

答案 2 :(得分:0)

我建议使用-exec的{​​{1}}操作在您的循环中调用find

开始文件结构:(如您所见,我从folder_a和folder_b的父级调用它)

mv

命令:

$ find
.
./folder_a
./folder_a/1abc_a.txt
./folder_a/1abc_c.txt
./folder_a/1abc_f.txt
./folder_a/2def_g.txt
./folder_a/3xyz_a.txt
./folder_b
./folder_b/1abc
./folder_b/2def
./folder_b/3xyz
./list.txt

$ cat list.txt
1abc
2def
3xyz

备用命令(同样的事情,只在一行上):

while read pattern
 do 
  find ./folder_a -type f -name "$pattern*" -exec mv "{}" "./folder_b/$pattern" \;
 done <list.txt

生成的文件结构:

while read pattern; do find ./folder_a -type f -name "$pattern*" -exec mv "{}" "./folder_b/$pattern" \;; done <list.txt