# [Minicurso 2025] 02. Introdução ao Linux
###### tags: `Minicurso25`

[TOC]
## Tabela de comandos básicos:
|Comando | Função|
|--------|-------|
|pwd | Mostra o caminho completo até o diretório atual|
|cd | Muda do diretório atual para o especificado|
|ls | Lista conteúdos de um diretório|
|cp | Copia arquivos|
|mv | Move/ Renomeia diretórios e arquivos|
|ln | Cria link simbólico (atalho) de um diretório ou arquivo|
|mkdir | Cria diretório|
|rmdir | Remove diretório|
|rm | Remove arquivos|
|tree | Exibe a árvore de diretórios e subdiretórios|
|touch | Cria arquivo vazio|
|locate | Procura arquivo por nome|
|find | Procura arquivos em diretórios específicos|
|grep | Procura por padrões específicos dentro de um arquivo de texto|
|cat | Mostra um arquivo de texto por completo|
|head | Mostra as primeiras linhas de um arquivo de texto|
|tail | Mostra as últimas linhas de um arquivo de texto|
|more | Mostra um arquivo de texto completo, mas uma página por vez|
|less | Similar ao ‘more’, mas mais simplificado|
|wc | Conta o número de linhas, palavras e caracteres|
|df | Exibe o espaço livre de armazenamento|
|du | Exibe o espaço em uso de armazenamento|
|chmod | Altera as autorizações de um arquivo ou diretório|
|chown | Altera o dono de um arquivo ou diretório|
|top | Lista os processos que mais estão consumindo CPU/RAM|
|ps | Lista todos os processos vigentes|
|kill | Interrompe um processo|
|history | Lista os últimos comandos realizados|
|wget | Permite o download de arquivos da Web|
|uname | Revela informações sobre o sistema operacional|
|ping | Mede o tempo de resposta de um servidor|
|hostname | Revela informações da rede|
|zip/unzip | Compacta/Descompacta diretórios e arquivos|
|exit | Encerra a sessão|
|sed | Editor de texto em linha|
|vim | Editor de texto em tela cheia|
|cut | Exibe colunas específicas de arquivos delimitados|
|sort | Ordena informações alfanumericamente|
|uniq | Suprime informações repetidas|
|time | Mede o tempo de execução de programas|
|clear | Limpa a tela do terminal|
## Parte I: Atividades dos comandos básicos
1. Liste os arquivos de um diretório com o comando `ls`
:::spoiler
```bash=
# Lista arquivos de um diretório
ls
```
:::
---
2. Alguns comandos podem receber parâmetros adicionais. Normalmente, é feito pela adição de um `-` ou `--`. Teste o comando `ls -a`, o que ocorreu?
:::spoiler
```bash=
# Visualização de arquivos ocultos
ls -a
```
:::
---
3. Teste as variações: `ls -l`, `ls -la`, `ls -lat`. O que mudou?
:::spoiler
```bash=
# Listar em forma de lista
ls -l
# Listar em forma de lista incluindo arq. ocultos
ls -la
# Listar em forma de lista, incluindo arq. ocultos, em ordem cronológica
ls -lat
```
:::
---
4. Acesse o manual do comando `ls`, adicionando o parâmetro: `ls --help`.
:::spoiler
```bash=
# Ajuda pode ser obtida com o parâmetro --help
ls --help
```
:::
---
5. Teste o comando `pwd`, o que ele informa?
:::spoiler
```bash=
# pwd = print working directory - mostra o diretório atual
pwd
```
:::
---
6. Crie um diretório chamado `teste` com o comando `mkdir` (make directory).
:::spoiler
```bash=
# Criar diretório
mkdir teste
```
:::
---
7. O comando `cd` (change directory) serve para nos mover na árvore de diretórios.

---
8. Entre no diretório recém-criado com o comando `cd`.
:::spoiler
```bash=
# Mover para o diretório "teste"
cd teste/
```
:::
---
9. Caminhos podem ser **relativos** ou **absolutos**. Volte ao diretório anterior utilizando o caminho **relativo** (`cd ..`) e avance para ela, novamente, utilizando o caminho **absoluto**.
:::spoiler
```bash=
# Voltar para o diretório anterior:
cd ../
# Voltar ao "teste" com o caminho absoluto:
cd /home/<usuario>/teste/
```
:::
---
10. Crie um arquivo vazio chamado `arquivo.txt` com o comando `touch`. Liste os conteúdos com o comando `ls`.
:::spoiler
```bash=
# Criando arquivo vazio
touch arquivo.txt
# Checando a presença do arquivo
ls
```
:::
---
11. Crie uma cópia do arquivo chamada `arquivo2.txt` com o comando `cp` (copy).
:::spoiler
```bash=
# Criando cópia do 'arquivo.txt' com o nome 'arquivo2.txt'
cp arquivo.txt arquivo2.txt
```
:::
---
12. Mude o nome do `arquivo.txt` para `arquivo1.txt` com o comando `mv` (move).
:::spoiler
```bash=
# Renomeando 'arquivo.txt' como 'arquivo1.txt'
mv arquivo.txt arquivo1.txt
```
:::
---
13. Sem sair do diretório atual ("teste"), crie uma cópia (`cp`) do `arquivo1.txt` como `arquivo3.txt` no diretório anterior (seu "home"), então mova-a para o diretório atual com o comando `mv`.
:::spoiler
```bash=
# Criando uma cópia no diretório anterior:
cp arquivo1.txt ../arquivo3.txt
# Movendo a cópia para o diretório atual:
mv ../arquivo3.txt ./
```
:::
---
::: danger
14. Remova os arquivos criados com o comando `rm` (remove).
:::
:::spoiler
```bash=
# Removendo arquivos
rm arquivo1.txt arquivo2.txt arquivo3.txt
# Ou...
rm arquivo*
```
:::
---
:::danger
15. Retorne ao "home" (`cd ~`) e apague o diretório 'teste'. O `rm` funciona? Tente o `rmdir` ou `rm -rf`.
:::
:::spoiler
```bash=
# Removendo diretório 'teste'
rmdir teste/
# Ou...
rm -rf teste/
# PS: arquivos apagado no linux não podem ser recuperados!
```
:::
---
16. Copie os arquivos `amostra1.fastq` e `amostra2.fastq` do diretório `/srv/cibioinfo/tutoriais/` para a sua "home". Dica: utilize caractere coringa `*` para copiar ambos de uma vez só!
:::spoiler
```bash=
# Copiando arquivos para o tutorial:
cp /srv/cibioinfo/tutoriais/amostra1.fastq ~/
cp /srv/cibioinfo/tutoriais/amostra2.fastq ~/
# Ou...
cp /srv/cibioinfo/tutoriais/amostra*.fastq ~/
```
:::
---
17. Visualize os arquivos com os comandos: `head`, `tail`, `more`, `less` e `cat`. Quais as diferenças?
:::spoiler
```bash=
# head: primeiras linhas. Por padrão são 10, podem ser específicadas
head -5 amostra1.fastq
# tail: head inverso
tail -5 amostra1.fastq
# more: visualizar arquivo de forma paginada (aperte 'q' para sair)
more amostra1.fastq
# less: similar ao 'more', controle com setas ou pg up/pg down. Teste com o parâmetro '-S' para uma visualização mais natural
less amostra1.fastq
less -S amostra1.fastq
# cat: abre o arquivo do começo ao fim
cat amostra1.fastq
```
:::
---
18. Use o comando `wc` e descubra quantas linhas e quantas sequências temos nessas bibliotecas.
:::spoiler
```bash=
# wc (word count) mostra: linhas(-l)/palavras(-w)/caracteres(-c)
wc amostra1.fastq
wc -l amostra1.fastq
```
:::
---
19. Use o comando `grep` para encontrar padrões nos arquivos. É possível identificar o número de sequências presentes? Dica: Encontre um padrão único!
:::spoiler
```bash=
# GREP - procura padrão dentro de arquivos de texto.
# Seq. qualquer:
grep "AAAAT" amostra1.fastq
# IDs de sequências:
grep "@" amostra1.fastq # Algumas qualidades apresentam '@'
grep "@SRR" amostra1.fastq # Isolamento dos IDs
```
:::
---
20. Combine comandos em sequência com o "pipe" (`|`). Para testar, combine o comando `grep` com o `wc -l`.
:::spoiler
```bash=
# Carregando os IDs e contando as linhas:
grep "@SRR" amostra1.fastq | wc -l
```
:::
---
21. A saída das execuções podem ser redirecionadas para um arquivo com o `>` (sobrescrever) ou `>>` (adicionar). Salve os IDs das sequências de cada biblioteca em um arquivo a parte (`IDs1.txt`, `IDs2.txt`), combinando o `grep` com o redirecionador `>`.
:::spoiler
```bash=
# Carregando os IDs e repassando a um arquivo:
grep "@SRR" amostra1.fastq > IDs1.txt
grep "@SRR" amostra2.fastq > IDs2.txt
```
:::
---
22. O comando `cat` pode concatenar múltiplos arquivos em sequência. Utilize-o com os IDs e repasse tudo para um único arquivo.
:::spoiler
```bash=
# Concatenando e salvando IDs de múltiplos arquivos
cat IDs1.txt IDs2.txt > IDs.txt
# Ou...
cat IDs*.txt > IDs.txt
```
:::
---
23. Vamos observar se há IDs repetidas entre as bibliotecas. Para isso, vamos ordenar o arquivo `IDs.txt` com o comando `sort` e combina-lo com o **reverso** do comando `uniq` (`uniq -d`). Salve o resultado em um novo arquivo: `IDs_duplicados.txt`
:::spoiler
```bash=
# Ordenando IDs (alfabeticamente) e detectando duplicados:
sort IDs.txt | uniq -d
# Salvando a saída:
sort IDs.txt | uniq -d > IDs_duplicados.txt
```
:::
---
24. Por fim, vamos rodar o programa `pullseq` para obter essas sequências e salva-las em um novo arquivo. Contudo, o `pullseq` não tolera o caractere especial inicial das sequências (Ex. ">" ou "@") e, portanto, precisamos remove-lo. Para isso, utilizaremos o editor de texto em linha `sed` com o parâmetro `'s/@//g'` (lê-se: "substitua o '@' por nada") e salvar a saída no arquivo: `IDs_duplicados2.txt`.
:::spoiler
```bash=
# SED é um editor de texto capaz de alterar o conteúdo diretamente na sua saída.
sed 's/@/AAAAAA/g' IDs_duplicados.txt
# Removendo o '@' e salvando em um novo arquivo:
sed 's/@//g' IDs_duplicados.txt > IDs_duplicados2.txt
```
:::
---
25. Rode o `pullseq` passando o caminho da biblioteca com as sequências (`--input`) e do arquivo com os IDs (`--names`). Repasse a saída para um arquivo (`>`).
:::spoiler
```bash=
# Conheça o 'pullseq' com o comando 'pullseq --help'
pullseq --help
# Rodando o 'pullseq':
pullseq --input amostra1.fastq --names IDs_duplicados2.txt
# Rodando o 'pullseq' e salvando o resultado:
pullseq --input amostra1.fastq --names IDs_duplicados2.txt > seqs_duplicadas.fastq
```
:::
---
26. Crie um diretório chamado `tutorial_linux` e repasse os arquivos gerados até aqui para lá, combiando o comando `mv` com o caractere coringa (`*`) + a extensão dos arquivos.
:::spoiler
```bash=
# Criando o diretório:
mkdir tutorial_linux
# Movendo arquivos:
mv *fastq ./tutorial_linux
mv *txt ./tutorial_linux
```
:::
---
## Parte II: Screen
- Uma das vantagens de se processar dados em um servidor é a possíbilidade de executar as tarefas em *background*, ou seja, sem a necessidade de estar diretamente ligado à tarefa, ou mesmo com a interface ligada. Contudo, isso não é feito de forma automática e requer alguns comando específicos.
- Uma forma mais simples é a utilização do programa `screen`. Esse utilitário, permite a abertura de uma tela paralela, com o adicional de possuir múltiplas abas, e que pode ser facilmente "desacoplada" e "acoplada" novamente. Dessa forma, jogando processos longos para o *background* sem risco de interrompe-los.
- Agora, vamos abrir um novo screen nomeado com o comando abaixo:
```bash=
screen -S teste
```
- Vamos treinar o ato de sair e voltar, novamente, para o screen. Para isso, utilizaremos primeiro a função de *"detach"*. Pressione as teclas `CTRL + A` seguido da tecla `D`. Note que você voltou para a tela sem screen.
- Para retornar ao screen, utilize o comando:
```bash=
screen -r teste
```
- Alguns atalhos utéis p/ `screen` são:
| Atalho | Função |
|--------|--------|
| `CTRL+A` + `D` | Desacopla `screen`, voltando a tela normal |
| `CTRL+A` + `C` | Cria uma nova aba |
| `CTRL+A` + `A` | Retorna para a última aba usada |
| `CTRL+A` + `N` | Avança para a próxima aba |
| `CTRL+A` + `P` | Volta para a aba anterior |
| `CTRL+A` + `[0-9]` | Vai para aba específica |
| `CTRL+A` + `K` | Mata a aba atual |
| `CTRL+A` + `Esc` | Libera o cursor, permitindo mover a visualização |
- Alguns comandos utéis p/ `screen` são:
| Comando | Função |
|---------|--------|
| `screen` | Abre uma screen não-nomeada |
| `screen -S <nome>` | Abre uma screen com o nome `<nome>` |
| `screen -r` | Retorna para a screen desacoplada, se só existir uma aberta |
| `screen -r <nome>` | Retorna para screen desacoplada `<nome>` |
| `screen -X <nome>` | Retorna para uma screen acoplada `<nome>` (múltiplas janelas) |
| `screen -ls` | Lista todas as screens abertas, acopladas ou não |
| `screen -wipe <nome>` | Elimina uma screen travada (só se ela estiver "morta") |
| `screen -X -S <nome> quit` | Elimina uma screen travada (não-morta) |
| `exit` | (Dentro da screen) Fecha aba/ Finaliza screen se for única aba |
| `screen --help` | Mostra todos os comandos possíveis do `screen` |
## Parte III: Preparação do ambiente para o minicurso
### 1. Criação da estrutura de diretórios
O projeto será executado em uma estrutura de diretórios que se divide em 4 pastas principais:
- **`dados`**: Dados originais obtidos pelo processo de sequenciamento. Devem ser mantidos como um "backup" e nunca serem editados diretamente.
- **`info`**: Alguns arquivos acessórios que serão pontualmente importantes para algumas análises.
- **`analises`**: Resultados das tranformações dos dados serão localizados nas subpastas desse diretório.
- **`scripts`**: Arquivos para automação do processamento dos dados. Daqui serão rodados a maior parte dos comandos (QG da análise!).
Agora vamos criar as pastas:
```bash=
# Criando as pastas principais:
mkdir -p ~/projeto/{dados,info,analises,scripts}
# Criando as subpastas das análises:
mkdir -p ~/projeto/analises/{atropos,dada2,fastp,fastqc,flash,usearch/{findadapt,meanee,trimsize}}
```

### 2. "Copiando" dados
Dados de sequenciamento são, geralmente, grandes em tamanho. Portanto, é comum a utilização de links simbólicos (similar aos atalhos do windows) para substituir cópias "sólidas" nos HDs. O comando `ln` permite a criação de atalhos que apontam para dados originais, servindo como um "marcador de posição" (placeholder) nas análises que virão.
Entre na pasta do `projeto` e execute o comando abaixo:
```bash=
# Sintaxe: ln -s <pasta/arquivo_de_origem> <pasta_de_destino>
ln -s /srv/cibioinfo/projeto/data/*.fastq ~/projeto/dados/
```
### 3. Copiando scripts
Processar uma ou duas bibliotecas pode ser simples e rápido. Mas quando lidamos com uma grande quantidade de amostras (ou a necessidade de repetir a mesma análise múltiplas vezes) é comum a utilização de scripts. Scripts são comandos em série associados com controles de fluxo (loops), capazes de executar a mesma função para cada arquivo (for) ou enquanto uma condição se manter verdadeira (while). Embora conheceremos e executaremos todos os programas necessários, as repetições serão feitas através de scripts. Então vamos copia-los para a pasta `scripts`.
```bash=
cp /srv/cibioinfo/projeto/scripts/*sh ~/projeto/scripts/
```
### 4. Copiando informativos
Alguns arquivos adicionais como contagens, metadados e os primers biológicos utilizados na obtenção dos amplicons.
```bash=
cp /srv/cibioinfo/projeto/info/* ~/projeto/info/
```
### 5. Checklist
Cheque se está tudo certo com o comando `tree` dentro da pasta do projeto:
```bash=
cd ~/projeto
tree
```

### 6. Conheça o delineamento experimental
Na pasta `info` encontra-se o arquivo `metadados.txt`. Visualize-o para conhecer os fatores estudados nesse experimento.
```bash=
less -S ~/projeto/info/metadados.txt
```