precisa mover arquivos com nome para diretórios com nomes correspondentes

2

Eu tenho arquivos nomeados

patient_sample_L001_R1_001, patient_sample_L002_R1_001, patient_sample_L003_R1_001, patient_sample_L004_R1_001

outro conjunto chamado

patient_sample_L001_R1_002, patient_sample_L002_R1_002, patient_sample_L003_R1_002, patient_sample_L004_R1_002,

e assim por diante. Para cada conjunto de 4 arquivos (com diferentes números finais 001,002,003) eu preciso movê-lo para um diretório apropriado chamado patient0001, ou paciente 0002, e assim por diante. Eu tenho cerca de 200 desses conjuntos. Existe um comando que eu possa fazer para procurar arquivos com um número final diferente e colocá-lo na pasta apropriada do paciente?

, por exemplo, patient_sample_L001_R1_001, patient_sample_L002_R1_001, patient_sample_L003_R1_001, patient_sample_L004_R1_001,  vai para "pasta patient0001 e etc.

Cada um desses arquivos está em diretórios diferentes. Por exemplo, o diretório principal tem um diretório chamado run40, nele estão os dados do patient1. Então, no run41, há os dados do paciente 2 e etc. de volta no diretório principal existe outro diretório chamado "total_patient_samples", onde você pode encontrar todos os diretórios que eu quero mover os arquivos dos diretórios "run40, run41" para dentro. Nesse arquivo há patient0001, paciente 0002, paciente 0003. Eu gostaria que os arquivos de dados mencionados anteriormente entrassem lá.

    
por rawr 19.10.2015 / 17:03

3 respostas

1

Que tal

for i in 'seq -f '%03g' 1 200'; do
    FOLDER=patient0$i
    mkdir -p total_patient_samples/$FOLDER    # creates folder if missing
    find . -regex ".*patient_sample_L00._R._${i}$" -type f -exec mv -i {} total_patient_samples/$FOLDER/ \; # moves patient data if not already there, else prompts
done

Isso ativa i de 001 a 200 (altera 200 se necessário), cria a pasta paciente (remove a linha mkdir ... se não for necessária), localiza todos os pacientes da estrutura especificada e os move para a pasta.

    
por 19.10.2015 / 17:14
1

Você pode fazer algo como:

cd total_patient_samples
find ../ -name patient_sample_\* | while read -r i; do
    pnum="${i##*_}"
    mkdir -p "patient$pnum"
    mv -v "$i" "patient$pnum"
done

Isso depende sensivelmente dos nomes exatos dos arquivos, por isso é bom ter cuidado.

EDIT: Código atualizado de acordo com o comentário abaixo. Isso irá capturar qualquer arquivo no diretório principal que corresponda a patient_sample_* , portanto, certifique-se de que não há nenhum que não queira mover.

    
por 19.10.2015 / 17:08
0

Você pode fazer algo assim:

for file in patient*; do
 PATIENT_NO=$(echo $file | sed 's/patient_sample_.*R1_\(.*\)//')
 PATIENT_DIR=patient$PATIENT_NO
 mkdir -p $PATIENT_DIR
 mv $file $PATIENT_DIR
done

Primeiro cortamos com sed o número do paciente, construímos o nome do diretório e movemos o arquivo para ele.

    
por 19.10.2015 / 17:13