我有一个包含约 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