AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 791097
Accepted
Carlos Fernandes
Carlos Fernandes
Asked: 2025-02-15 20:49:19 +0800 CST2025-02-15 20:49:19 +0800 CST 2025-02-15 20:49:19 +0800 CST

Como salvar a saída de cada iteração de um comando de loop em uma nova pasta diferente?

  • 772

Sou um novato em Unix, então peço desculpas se a solução para essa pergunta for muito fácil. Estou interessado em executar um script várias vezes (porque o processo/algoritmo não produz exatamente a mesma resposta em cada réplica; o objetivo é então obter uma média, intervalo de confiança, etc. das execuções de réplicas), e para isso estou tentando usar um loop (neste exemplo para 50 réplicas):

for i in {1..50}; do bash script.sh infile.txt; done

Mas assim, obviamente, a saída de cada nova iteração sobrescreve a saída da anterior. Gostaria de saber como posso salvar a saída (uma série de arquivos e pastas) de cada iteração em uma nova pasta diferente, ou seja, para um total de 50 pastas neste exemplo. Estou tentando fazer isso no terminal em um Mac.

Atualização: Desculpe, esqueci de mencionar que o script requer, para ser executado com sucesso, a leitura de um arquivo de parâmetros de entrada e usa/invoca um monte de executáveis, todos localizados dentro de uma pasta chamada PROGRAMMES. Então, em uma execução normal do script, ambos, mais o script e o infile, ficam na mesma pasta. Mais especificamente, a parte inicial do script contém os seguintes argumentos (aqui está um link para o script: https://github.com/esrud/GONE/blob/master/MacOSX/script_GONE.sh ):

### Set arguments

### Take input parameters from file INPUT_PARAMETERS_FILE

source INPUT_PARAMETERS_FILE

### EXECUTABLES FILES NEEDED IN DIRECTORY PROGRAMMES:

### MANAGE_CHROMOSOMES2
### LD_SNP_REAL3
### SUMM_REP_CHROM3
### GONE (needs gcc/7.2.0)
### GONEaverages
### GONEparallel.sh

Muito obrigado por qualquer sugestão/ajuda.

Carlos

bash
  • 2 2 respostas
  • 186 Views

2 respostas

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2025-02-16T15:00:13+08:002025-02-16T15:00:13+08:00
    for dir in dir{01..50}; do
      mkdir -p "$dir" &&
        (cd "$dir" && exec bash ../script1 ../infile.txt)
    done
    

    Basicamente o mesmo que o de @JdeHann, exceto que:

    • Os diretórios são numerados dir01, dir02... dir50, para que sejam classificados numericamente na saída, lspor exemplo.
    • verificamos o status de saída de mkdire cdantes de continuar.
    • usamos um subshell para que isso cdafete somente aquele subshell. Preferível no caso geral, pois cd ..nem sempre é garantido que você vá para o mesmo lugar de onde começou (como se o script movesse seu diretório de trabalho atual).

    Se o script precisar que os arquivos e outros recursos estejam no mesmo diretório, você pode usar links simbólicos:

    for dir in dir{01..50}; do
      mkdir -p "$dir" &&
        ln -sf ../{script1,infile.txt,other-required-resources} "$dir" &&
        (cd "$dir" && exec bash ./script1 infile.txt)
    done
    

    Editar . Olhando para esse script agora que você forneceu um link para ele, entre os muitos erros de codificação lá, há source INPUT_PARAMETERS_FILEwhich should have been source ./INPUT_PARAMETERS_FILE.

    Com source INPUT_PARAMETERS_FILE, isso significa que INPUT_PARAMETERS_FILEé pesquisado em $PATH(e então no diretório de trabalho atual se não for encontrado, $PATHa menos que o bash seja executado no modo POSIX), o que provavelmente não foi intencional, mas aqui significa que podemos evitar adicionar um link simbólico a esse arquivo adicionando o diretório que contém esse arquivo a $PATH:

    (
      PATH=$PATH:$PWD
      for dir in dir{01..50}; do
        mkdir -p "$dir" &&
          ln -sf ../{KNP_sub24.3.{ped,map},PROGRAMMES} "$dir" &&
          (cd "$dir" && exec bash ../script_GONE.sh KNP_sub24.3)
      done
    )
    
    • 4
  2. JdeHaan
    2025-02-15T21:10:37+08:002025-02-15T21:10:37+08:00

    Que tal isto:

    for i in {1..50}; do
       mkdir -pv "${i}"
       cd "${i}" &&
       ../script.sh ../infile.txt; 
       cd ..
    done
    

    Isso pressupõe que o script.sh exista no diretório de nível superior. Talvez você deva usar o mesmo no infile.txt.

    • 2

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve