다른 파일과 일치하는 이름을 기반으로 파일을 다른 디렉터리로 이동합니다.

다른 파일과 일치하는 이름을 기반으로 파일을 다른 디렉터리로 이동합니다.

약 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 쉘을 사용하여 이 작업을 수행하는 방법을 모르겠습니다!

답변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

관련 정보