如何根据列表将不同文件移动至对应独立新目录?
批量移动文件到对应目录的命令问题
我有一个目录包含500多个格式如下的文件:
GCA_000007345.1.fa.gz GCA_000681355.2.fa.gz GCA_000802095.1.fa.gz
同时我有一个制表符分隔的txt文件genomes_retrieved.txt,其中第一列为文件名,第二列为需创建的目标目录名,文件需移动至该目录:
GCA_000007345.1.fa.gz Methanosarcina_acetivorans_C2A GCA_000681355.2.fa.gz Peptococcaceae_bacterium_SCADC1_2_3 GCA_000802095.1.fa.gz Peptococcaceae_bacterium_BICA1-7
我已经通过以下命令创建了所有目标目录:
awk 'NR > 1{ print $2 }' ../genomes_retrieved.txt | xargs -I {} mkdir {}
但不确定如何正确编写mv的命令,当前尝试的命令是:
awk 'NR > 1{ print $1 }' ../genomes_retrieved.txt | xargs -I {} mv
寻求正确的操作建议。
解决方案
方法1:awk + xargs 一次性完成移动
直接让awk同时输出文件名和目标目录,配合xargs按参数对执行移动:
awk 'NR > 1{ print $1, $2 }' ../genomes_retrieved.txt | xargs -n 2 mv
- 解释:
awk跳过第一行后,每行输出文件名+目标目录的组合;xargs -n 2表示每次取2个参数传给mv,刚好匹配mv 源文件 目标目录的命令格式。
方法2:生成带引号的命令避免特殊字符问题
如果文件名或目录名可能包含空格、特殊字符,用awk生成带双引号的完整命令,再交给shell执行:
awk 'NR > 1{ printf "mv \"%s\" \"%s\"\n", $1, $2 }' ../genomes_retrieved.txt | sh
- 解释:双引号会包裹住文件名和目录名,避免特殊字符导致命令解析错误,确保每个文件都能正确移动。
补充:合并创建目录+移动的一步式命令
如果担心之前的目录创建有遗漏(比如部分目录已存在导致mkdir报错),可以把创建和移动合并,用mkdir -p确保目录存在:
awk 'NR > 1{ printf "mkdir -p \"%s\" && mv \"%s\" \"%s\"\n", $2, $1, $2 }' ../genomes_retrieved.txt | sh
- 解释:
mkdir -p会自动创建不存在的目录,已存在的目录也不会报错;&&确保目录创建成功后再执行移动操作,一步完成所有任务。
内容的提问来源于stack exchange,提问作者mss
相关产品推荐
相关产品推荐

