有选择地将部分匹配的文件移动到不同的目录

有选择地将部分匹配的文件移动到不同的目录

我正在一台 Linux 服务器上工作,其中父目录有 100 个部分编号的文件,例如

GGG12345_abb.txt 
GGG12346_abc.txt 
GGG12347_cbx.txt 
.
.
GGG19045_jha.txt 

其中每个类别对应一个类别,例如:

myname1 
myname2
.
.
myname12

另外,还有一个索引文本文件,它有两列,name和id,有partialmyname*GGGindex(没有_xxx.txt

12_12_myname1_abc GGG12345
12_15_myname1_abc GGG12346
.
.
11_15_myname2_abc GGG12353

我已经创建了子目录等MYNAME1MYNAME2如何从索引文件中选择文件索引并将相应的文本文件移动到相关的子目录中?例如GGG12345_abb.txt类别myname1到目录MYNAME1

答案1

尝试看看下面的脚本是否能满足您的要求

while IFS="[ _]" read a b dir c file ; do echo mv -t ${dir^^} ${file}* ; done < index.file

然后删除echo

答案2

如果您的元数据文件中有此内容:

12_12_我的名字1_ABCGGG12345

意味着您必须复制文件 GGG12345_ABC目录中的.txt我的名字1您可以使用 awk 解析元数据文件并复制文件:

awk '{ x = split($1, arr, "_"); arr[3] = toupper(arr[3]); s = "mv " $2 "_" arr[4] ".txt " arr[3]; } { system(s); }' metadata

您可以先在不使用的情况下测试它system,看看命令会做什么:

awk '{ x = split($1, arr, "_"); arr[3] = toupper(arr[3]); s = "mv " $2 "_" arr[4] ".txt " arr[3]; } { print s; }' metadata

如果 abc 在:

12_12_我的名字1_ABCGGG12345

没关系,例如您只需要 GGG12345 和 MYNAME1:

awk '{ x = split($1, arr, "_"); arr[3] = toupper(arr[3]); s = "mv " $2 "* " arr[3]; } { system(s); }' metadata

再次,您可以在不使用的情况下进行测试system

awk '{ x = split($1, arr, "_"); arr[3] = toupper(arr[3]); s = "mv " $2 "* " arr[3]; } { print s; } ' metadata

相关内容