Computation‎ > ‎

ThingsIdoAllTheTime

Capture a part of a filename

Capture the begining of a filename
Study_Patient_Assay_Date.txt
> echo Study_Patient_Assay_Date.txt | cut -c-13
Study_Patient

Rename Files using Part of Current filename

This can be done multiple ways but I use two commonly depending on the format of the files

1) Files without complete standardization
Patient001_20130102.txt
Patient002_19990203_run2.txt

#Loop through all files in current directory ending with .txt
for line in `ls *.txt`
do

    #Capture the patient name from each file as a variable
    PATIENT_NAME=`echo ${line} | cut -c-10`

    #Rename files
    mv ${line} ${PATIENT_NAME}.txt

    #Message
    echo
    echo "---------------------------------"
    echo "Parsing file: ${line}"
    echo Old Name=${line}
    echo New Name=${PATIENT_NAME}.txt

done

2) Files with standardized endings
Patient001_2013_rc_ir_dm.bam
Patient002_20120118_rc_ir_dm.bam

#Loop through all files in current directory ending with .bam
for line in `ls *.bam`
do

    #Capture the non-standard portion of the filename as a variable, using the unix basename function
    BASE_NAME=`basename ${line} "_rc_ir_dm.bam"`

    #Rename files
    mv ${line} ${BASE_NAME}.bam

    #Message
    echo
    echo "---------------------------------"
    echo "Parsing file: ${line}"
    echo Old Name=${line}
    echo New Name=${BASE_NAME}.bam

done

Replace a portion of a file name with something else (ie. Find X and Replace with Y)

#Loop through all files in current directory ending with .md5
for line in `ls *.md5`
do

    #Rename files using move (mv) command
    #The substitution function ${line//foo/bar} has two slashes to replace every occurrence of foo with bar
        mv $line ${line//KBS5U/KBS5X}

    #Message
    echo
    echo "---------------------------------"
    echo "Parsing file: ${line}"
    echo Old Name=${line}
    echo New Name=${line//KBS5U/KBS5X}

done
Bottom
Comments