gera nomes de arquivos em loop [closed]

1

AVISO LEGAL: Estou usando o Mac OSX. O script bash está em um diretório diferente dos arquivos que requerem processamento. A partir daqui minha luta começa ...

HELP 1 : Eu tenho vários arquivos, cada um armazenado em um subdiretório de um diretório pai que precisa ser alimentado como arquivos de entrada para minha ferramenta de bioinformática. Eu achei que o loop for funcionaria para isso.

for file in ~/Desktop/parent\ folder/*/*.txt;
do exTool INPUT= ${file##*/} OUTPUT= ${file%.txt}_exd.txt 

Espero inserir o arquivo (cortando a listagem de pastas anexada ao arquivo $) e, em seguida, enviar um arquivo, removendo '.txt' e adicionando _exd.txt. O erro que recebo é que a entrada está carregando a lista de pastas e, especificamente, o espaço em branco 'pai \ pasta' está causando as informações erradas de entrada.

HELP 2 : Como uma extensão do primeiro caso, se eu quiser enviar o arquivo para o mesmo subdiretório da entrada, eu tenho que adicionar um comando especial?

HELP 3 : Se eu houver 2 arquivos em cada subdiretório (input_1.txt e input_2.txt) e gostaria de inserir ambos em um único comando. Como o script ficaria se aninhado em um loop for?

for file in ~/Desktop/parent\ folder/*/*.txt;
do bioTool INPUT1= ${file%.txt}_1.txt INPUT2= ${file%.txt}_2.txt OUTPUT= ${file%%.*}

Para a saída, observe que estou precisando apenas do nome do arquivo base, pois a ferramenta anexará um número no final do nome para indicar a saída do primeiro e segundo arquivo e a extensão. Por alguma razão, sinto que a seção após 'in' no loop for está sendo feita incorretamente. Foi uma solução automática para ter o script em um diretório diferente dos arquivos.

Qualquer ajuda será muito apreciada, votada, apreciada, aceita, favorecida. Muito obrigado pela sua ajuda.

    
por ozarka 03.02.2016 / 14:23

1 resposta

1

HELP 1

Devido ao espaço em branco, você precisa citar:

INPUT= "${file##*/}" OUTPUT= "${file%.txt}"_exd.txt

Parece um pouco estranho, porém, que exista um espaço entre INPUT= e o nome do arquivo.

AJUDA 3

Se você tiver um arquivo input_1.txt , então ${file%.txt}_1.txt se tornará input_1_1.txt .

Eu corresponderia ao nome exato do arquivo:

for file in ~/Desktop/parent\ folder/*/input_1.txt; do
    bioTool INPUT1= "${file}" INPUT2= "${file%_1.txt}_2.txt" OUTPUT= "${file%%.*}"
done

AJUDA 4

Isso não é nada de shell.

mudando para subdiretórios

for file in ~/Desktop/parent\ folder/*/input_1.txt; do
    subdir="${file%/*}"
    pushd "$subdir" &>/dev/null
    file="${file##*/}"
    bioTool INPUT1= "${file}" INPUT2= "${file%_1.txt}_2.txt" OUTPUT= "${file%%.*}"
    popd &>/dev/null
done
    
por 03.02.2016 / 14:31