我在 .txt 文件中有一个模式列表。 [列表.txt]。对于list.txt中的每一行,我想找到以list.txt中指定模式开头的位置处的所有文件,然后将这些文件移动到另一个位置。
考虑一个示例案例。
at ~/home/ana/folder_a
I have 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/
实际上,我希望将所有匹配模式“1abc”、“2def”和“3xyz”的文件从 /home/ana/folder_a/ 移动到 /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
Grep's -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
Pipe to 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 的答案是最好的方法,但我认为你可能会从这个答案中找到一些用处。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)