Com o comando find :
find /project/samples/ -name "*.fastq"
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.
Com o comando find :
find /project/samples/ -name "*.fastq"
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.
#!/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).
Tags bash shell-script