![有选择地将部分匹配的文件移动到不同的目录](https://linux22.com/image/62073/%E6%9C%89%E9%80%89%E6%8B%A9%E5%9C%B0%E5%B0%86%E9%83%A8%E5%88%86%E5%8C%B9%E9%85%8D%E7%9A%84%E6%96%87%E4%BB%B6%E7%A7%BB%E5%8A%A8%E5%88%B0%E4%B8%8D%E5%90%8C%E7%9A%84%E7%9B%AE%E5%BD%95.png)
我正在一台 Linux 服务器上工作,其中父目录有 100 个部分编号的文件,例如
GGG12345_abb.txt
GGG12346_abc.txt
GGG12347_cbx.txt
.
.
GGG19045_jha.txt
其中每个类别对应一个类别,例如:
myname1
myname2
.
.
myname12
另外,还有一个索引文本文件,它有两列,name和id,有partialmyname*
和GGG
index(没有_xxx.txt
)
12_12_myname1_abc GGG12345
12_15_myname1_abc GGG12346
.
.
11_15_myname2_abc GGG12353
我已经创建了子目录等MYNAME1
,MYNAME2
如何从索引文件中选择文件索引并将相应的文本文件移动到相关的子目录中?例如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