我在.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
答案 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