Atravessar subpastas usando script bash

1

Alguém pode me dizer como percorrer subpastas e identificar arquivos fastq usando o script bash:

/project/samples/data/intensities/r1.fastq
/project/samples/data/intensities/r2.fastq
/project/samples/sample1.txt

Vou passar apenas o diretório base / project / samples / para o meu script bash e preciso percorrer as subpastas para obter os arquivos fastq.

    
por nadish 30.06.2017 / 16:35

3 respostas

5

Com o comando find :

find /project/samples/ -name "*.fastq"
    
por 30.06.2017 / 16:38
2

No bash (não simples, sh), é possível usar o **/ padrão de curinga para percorrer diretórios recursivamente. Você precisa definir a opção globstar primeiro. Por exemplo, para executar mycommand em cada arquivo .fastq em /project/samples :

#!/bin/bash
shopt -s globstar
for x in /project/samples/**/*.fastq; do
  mycommand "$x"
done

Isso só está disponível desde o bash 4.0 (portanto, não no bash padrão no OSX, mas o recurso também está disponível em zsh). Nas versões bash anteriores a 4.3, tome cuidado para que ele também passe por links simbólicos para diretórios.

Se você precisar executar um único comando em todos os arquivos, você pode:

mycommand /project/samples/**/*.fastq

No entanto, você pode ter um limite no comprimento da linha de comando. Isso ajuda a usar um caminho relativo:

cd /project/samples
mycommand **/*.fastq

Se isso ainda não couber, você precisará encontrar outra solução para fazer o que for necessário, o que não envolve passar todos os nomes de arquivo como argumentos para esse comando de uma só vez.

    
por 01.07.2017 / 01:14
1
#!/bin/bash

if [ ! -d "$1" ]; then
    printf 'Not a directory: %s\n' "$1" >&2
    exit 1
fi

find "$1" -type f -name "*.fastq" -print

Este é um script pequeno que simplesmente listará os arquivos fastq no diretório fornecido.

Se você quiser executar um comando para cada arquivo, a maneira mais simples seria alterar o find para

find "$1" -type f -name "*.fastq" -exec utility {} ';'

Onde utility é algum programa que pega o caminho de um arquivo fastq na linha de comando ( {} será substituído pelo caminho do arquivo fastq).

    
por 01.07.2017 / 08:55