根据与另一个文件匹配的名称将文件移动到不同的目录中

根据与另一个文件匹配的名称将文件移动到不同的目录中

我有一个包含约 6000 个文件的文件夹(其中一些是 .txt 和一些 .pdf 文件),我试图将它们组织在不同的文件夹中。文件夹看起来像这样:

$ ls ./res-defaults    
ML3020T1--ML3020N_chr6-209980-34769899-LOH_clusters.pdf
ML3020T1--ML3020N_chrom_clust_freqs.txt
ML3020T1--ML3020N_cluster_summary.txt
ML3020T1--ML3020N_mol_time_estimate.pdf
HTMCP-01-01-00451-01A-01D--HTMCP-01-01-00451-11B-01D_boots.txt

....

然后我有另一个文件,它是元数据文件

$ head meta.data
bam TRUE    81-52884    81-52884T   tumour  grch37  genome  A01423  DL_M    
bam TRUE    06-30342    ML3020T1    tumour  grch37  genome  A43002  ML_K        
bam TRUE    10-24757    10-24757T   tumour  grch37  genome  A61218  CL_GC
bam TRUE    HTMCP-01-01-00451   HTMCP-01-01-00451-01A-01D   tumour  grch37  genome  A71785  DL_HTMCP
    ....

琴弦“前”“——”res-defaults 文件夹中的文件名与元数据文件中的第 4 列匹配。

我想根据元数据中的第9列创建文件夹,并将res-default中的文件移动到元数据中的第4列与“--”之前的字符匹配的目录。

我期待这样的输出

$ ls ./ML_K
ML3020T1--ML3020N_chr6-209980-34769899-LOH_clusters.pdf
ML3020T1--ML3020N_chrom_clust_freqs.txt
ML3020T1--ML3020N_cluster_summary.txt
ML3020T1--ML3020N_mol_time_estimate.pdf

$ ls./DL_HTMCP
HTMCP-01-01-00451-01A-01D--HTMCP-01-01-00451-11B-01D_boots.txt

老实说,我不知道如何使用 bash shell 做到这一点!

答案1

您可以使用awk打印第四和第九字段:

$ awk '{print $4,$9}' meta.data
81-52884T DL_M
ML3020T1 ML_K
10-24757T CL_GC
HTMCP-01-01-00451-01A-01D DL_HTMCP

接下来,将其传递给read并将每个字段分配给一个变量。然后,创建目标目录(使用它,mkdir -p以便在目录已存在时不会抱怨),并将以前缀(第 4 个字段)开头的任何文件名移动到第 9 个字段中给出的目录名中:

awk '{print $4,$9}' meta.data | 
    while read prefix dirname; do 
        mkdir -p -- "$dirname" && mv -- "$prefix"* "$dirname"; 
    done

相关内容