Executando um comando em muitos arquivos

17

Eu tenho uma pasta com muitos arquivos (xyz1, xyz2, até o xyz5025) e preciso executar um script em cada um deles, obtendo xyz1.faa, xyz2.faa e assim por diante. saídas.

O comando para um único arquivo é:

./transeq xyz1 xyz1.faa -table 11

Existe uma maneira de fazer isso automaticamente? Talvez um combo de tarefas?

    
por Manuel 01.07.2017 / 22:11

5 respostas

28
for file in xyz*
do
  ./transeq "$file" "${file}.faa" -table 11
done

Esse é um loop for simples que itera todos os arquivos que começam com xyz no diretório atual e chamam o programa ./transeq com o nome do arquivo como primeiro argumento, o nome do arquivo seguido por ".faa" como o segundo argumento, seguido por "-table 11".

    
por 01.07.2017 / 22:26
22

Se você instalar o GNU Parallel , poderá fazê-lo em paralelo assim:

parallel ./transeq {} {}.faa -table 11 ::: xyz*

Se você programa intensamente com CPU, ele deve acelerar um pouco.

    
por 01.07.2017 / 23:19
6

Você pode fazer algo assim em uma linha de comando bash :

printf '%s\n' {1..5025} | xargs -l -I {} -t ./transeq xyz{} xyz{}.faa -table 11

Estamos gerando os números inteiros de 1 a 5025, um / linha, e os alimentando um por um para xargs, que encapsula o inteiro em {} e então o transplanta para a linha de comando ./transeq em um arquivo apropriado. maneira.

Se você não tiver o recurso de expansão de chave {n..m} , poderá invocar o utilitário seq para gerar esses valores numéricos.

Ou, você pode sempre emular a geração numérica via:

yes | sed -n =\;5025q | xargs ...
    
por 01.07.2017 / 22:24
4

Usando find, útil quando seus arquivos estão espalhados dentro dos diretórios

find -name "xyz*" -exec ./transeq {} {}.faa -table 11 \;
    
por 03.07.2017 / 10:50
3

Supondo que você tenha mais de um núcleo, e cada chamada possa ser executada independentemente do resto, você ganhará bastante aceleração com execuções paralelas.

Uma maneira relativamente simples de fazer isso é por meio do parâmetro -P de xargs - por exemplo, se você tiver 4 núcleos:

echo xyz{1..5025} | \
    xargs -n 1 -P 4 -I{} /path/to/transeq xyz{} xyz{}.faa -table 11

O -n 1 informa xargs para escolher apenas um argumento fora da lista para cada invocação (por padrão passaria bastante) , e o -P 4 diz para gerar 4 processos ao mesmo tempo - quando um morre, um novo é gerado.

IMHO, você não precisa instalar o GNU paralelo para este caso simples - xargs é suficiente.

    
por 05.07.2017 / 11:19