Estou tentando automatizar a execução de um comando python com argumentos usando vários arquivos (um de cada vez) e escrevendo a saída em diretórios de saída com o mesmo nome do arquivo de entrada, mas sem a extensão.
Os arquivos são arquivos fasta contendo as proteínas de genomas bacterianos. A rotina python é projetada para extrair essas proteínas com certas propriedades e imprimir várias saídas no diretório /myruns/test
. Se eu executá-lo com um genoma, o nome de test
seria substituído.
Exemplo:
O arquivo rápido XYZ.faa
será tomado como entrada e os arquivos de saída serão colocados em /myruns/XYZ
.
Manualmente funciona muito bem, mas quero usá-lo em lote com vários *.faa
arquivos e criar diretórios com seus nomes correspondentes, caso contrário, o último arquivo processado apagará o conteúdo do anterior.
Até agora eu construí o seguinte script:
#!/bin/sh
for filename in *.faa ; do
python predict_genome.py \
--fasta_path /Users/mvalvano/DeepSecE/myruns/${filename} \
--model_location /Users/mvalvano/DeepSecE/model/checkpoint.pt \
--data_dir data \
--out_dir myruns/test --save_attn --no_cuda
done
exit 0
Este script funciona, e os arquivos de saída são salvos em um diretório de teste que é especificado no --out_dir
argumento. Minha pergunta é como posso substituir test
no --out_dir
argumento por uma função que nomearia o diretório com o mesmo nome do arquivo de entrada. Tentei algumas opções, mas elas não parecem funcionar.
Obrigado Mike
Substitua
test
por"${filename%.faa}"
para obter o nome do arquivo com.faa
removido. Você também deve citar"${filename}"
para evitar problemas em caso de nomes de arquivo com espaços.Com arquivos de entrada
o script será executado
Possíveis problemas com este script:
Como você especifica
--fasta_path /Users/mvalvano/DeepSecE/myruns/"${filename}"
, seu script só funcionará sem erros se o diretório atual for/Users/mvalvano/DeepSecE/myruns/
ou se este diretório contiver pelo menos o mesmo conjunto de*.faa
arquivos que o diretório atual. (*.faa
será expandido para os nomes de arquivos no diretório atual.)Quando
/Users/mvalvano/DeepSecE/myruns/
é o diretório atual, o argumento--out_dir myruns/foo
pode esperar ou criar um diretório/Users/mvalvano/DeepSecE/myruns/myruns/foo
com doublemyruns
.Talvez fizesse mais sentido escrever assim:
Onde usamos apenas caminhos absolutos, removendo a dúvida sobre o que são caminhos relativos.
(aqui mudando para
zsh
(já que isso/Users
sugere macos) para seu:r
modificador ootname (de csh), seuN
qualificador ullglob e para remover a necessidade de citar todas as expansões).