Pular para o conteúdo
Todos os conceitos

Nomes de arquivo encrencados

Um ponto no começo esconde o arquivo; espaço, hífen e apóstrofo no nome confundem o shell.

O shell lê o que você digita e corta em pedaços nos espaços: o primeiro pedaço é o comando, os outros são opções e argumentos. Alguns caracteres no nome de um arquivo atrapalham esse corte. Quatro casos aparecem o tempo todo.

Ponto no começo: arquivo oculto. Por costume, o ls não mostra nomes que começam com ponto. É assim que os programas guardam configuração sem bagunçar a pasta (.bashrc, .ssh), e é um jeito fácil de esconder alguma coisa.

$ ls
notas.txt
$ ls -a
.  ..  .rascunho.txt  notas.txt

ls -a (all) mostra tudo. O . é a própria pasta e o .. é a de cima. Fora o nome, o arquivo oculto é um arquivo comum: cat .rascunho.txt lê normalmente. Vale olhar também o .bash_history, onde o bash guarda os comandos que a pessoa digitou.

Espaço no nome. cat lista de compras.txt vira três argumentos: lista, de e compras.txt. O cat tenta abrir os três, reclama dos que não existem e, se por azar existir um compras.txt, mostra o arquivo errado sem avisar. Junte o nome com aspas, ou com uma barra invertida antes de cada espaço:

$ cat "lista de compras.txt"
$ cat lista\ de\ compras.txt

Hífen no começo. cat -notas.txt é lido como uma fileira de opções do cat (-n, -o...), e ele reclama de opção inválida. Aspas não resolvem, porque o problema não é espaço: o shell tira as aspas e o cat recebe o mesmo -notas.txt. Duas saídas: deixar claro que é um caminho, com ./ na frente, ou avisar com -- que as opções acabaram.

$ cat ./-notas.txt
$ cat -- -notas.txt

Apóstrofo no nome. Em cat conta d'agua.txt, o apóstrofo abre uma aspa simples que nunca fecha, e o shell mostra um > esperando o resto. Aperte Ctrl+C para desistir e use aspas duplas, que aceitam o apóstrofo dentro: cat "conta d'agua.txt".

você digita o cat recebe cat lista de compras.txt lista de compras.txt 3 argumentos cat "lista de compras.txt" lista de compras.txt 1 argumento cat -notas.txt -n -o -t … opções, não arquivo cat ./-notas.txt ./-notas.txt 1 arquivo
Sem aspas, cat lista de compras.txt entrega três argumentos ao cat; com aspas, um só. cat -notas.txt vira opções; com ./ na frente, vira o caminho de um arquivo.

O atalho que resolve quase tudo é a tecla Tab: digite o começo do nome, aperte Tab e o shell completa o nome já com as aspas ou barras que faltam. No Linux, o ls também ajuda: quando o nome tem espaço ou apóstrofo, ele mostra o nome entre aspas (essas aspas não fazem parte do nome). No macOS, o ls mostra o nome sem aspas.

Em Python o problema some, porque o nome vai inteiro numa string: open("-notas.txt") e open("lista de compras.txt") funcionam, e os.listdir() mostra os ocultos também.

Aparece nestes desafios