respondendo ao comando automaticamente - executando a operação cp entre as respostas [closed]

0

A ideia é que eu queira executar um comando, então ele pede que um nome de arquivo seja processado, e depois que ele é processado, ele gera uma imagem com o nome prediction.png , ele pede o próximo nome de arquivo e em breve. Eu tenho milhares de arquivos, então não posso inseri-los manualmente, um por um. No entanto, eu tenho um arquivo .txt contendo todos os nomes de arquivos.

Então, eu queria escrever um script que:

1- execute o comando

2- quando ele pergunta sobre um nome de arquivo, ele lê a primeira linha do arquivo txt

3- o programa irá processar o arquivo, gera uma imagem, então cp esta imagem para outro diretório (para evitar sobrescrever o próximo arquivo)

4- então pede o próximo, faça o mesmo e assim por diante

até que o programa solicite um arquivo, e o arquivo .txt já tenha terminado, ele será finalizado automaticamente

O que eu posso fazer até agora é ler os arquivos um por um e passá-los como respostas para o meu programa quando ele pede usando

cat filenames.txt | ./program.sh

O problema é que eu quero cp a saída antes de processar o novo arquivo

    
por Mostafa Hussein 30.07.2018 / 14:25

2 respostas

1

Eu não acho que você possa fazer isso enquanto estiver executando program.sh apenas uma vez, pois ele continuará criando os arquivos, e você nunca pode ter certeza de quando um arquivo está completo.

Em vez disso, execute o programa uma vez para cada linha filenames.txt:

while IFS= read -r FILE; do # loop through files in filenames.txt
  echo "$FILE" | ./program.sh # run program once and end it with newline
  mv created_filename /some/other/location/${FILE}.ext; # move file
done < filenames.txt
  • Use mv em vez de cp , será mais rápido se você estiver migrando para o mesmo sistema de arquivos.
  • Altere .ext para o formato de saída (por exemplo, .png ).
por 30.07.2018 / 14:38
-1

Você pode fazer assim:

(
while IFS= read -r FILE; do
    echo "$FILE"
    sleep 1 # or somehow make a trigger to see when the file is ready ...
    mv output_file /somewhere/else
done < filenames.txt;
) | ./program.sh

( via )

mesmo usando xargs:

(
xargs -a filenames.txt -I{} sh -c 'echo {}; sleep 1; mv file /somewhere/else'
) | ./program.sh
    
por 30.07.2018 / 15:15