Como lidar com espaços em nomes de ficheiros no Linux

Laptop Linux mostrando um prompt do bash

Como a maioria dos sistemas operacionais, o Linux oferece suporte a nomes de ficheiros com espaços. Mas usar esses nomes de ficheiros na linha de comando nem sempre é simples. Aqui estão várias maneiras de lidar com nomes de ficheiros contendo espaços.

O humilde nome do ficheiro

Tudo armazenado no disco rígido do seu computador precisa ter um nome. Sem um nome, nenhum ficheiro existiria. Todos os aplicações e daemons iniciados quando o computador é inicializado e todo o software que tu usa devem ser identificados e armazenados em um sistema de ficheiros. esta identificação é o nome do ficheiro.

O mesmo se aplica aos ficheiros que tu cria ou instala. Todos os seus documentos, imagens e músicas precisam de nomes de ficheiro. Sem nomes de ficheiros, nenhum dos seus ativos digitais poderia existir. Como os nomes dos ficheiros são tão importantes, o Linux se esforça para impor o mínimo possível de regras sobre sua composição.

No Linux, um nome de ficheiro pode conter qualquer caractere além da barra “

 / 

” e o caractere nulo,

 0x00 

. O caractere nulo é usado para marcar o final de uma string, portanto não pode estar presente na própria string, ou o Linux truncaria o nome do ficheiro na posição do caractere nulo. O “

 / 

“A barra é usada como separador nos caminhos de diretório.

Os nomes de ficheiros diferenciam maiúsculas de minúsculas  e podem ter até 255 bytes de comprimento , incluindo o caractere nulo. Os caminhos de diretório podem ter até 4.096 bytes, incluindo o caractere nulo. Observe que este é o comprimento em bytes, que pode não corresponder diretamente a caracteres. Caracteres Unicode de 16 bits, por exemplo, ocupam dois bytes cada.

Os entusiastas da retrocomputação e aqueles com boa memória saberão que nos primeiros dias dos computadores pessoais, o sistema operacional de disco da Microsoft , DOS, não diferenciava maiúsculas de minúsculas e tinha um limite de nome de ficheiro de oito caracteres, além de uma extensão de três caracteres .

tu tinha que ser muito atencioso e às vezes criativo ao nomear os ficheiros. Em comparação, a liberdade que temos hoje significa que podemos nomear os ficheiros como quisermos, sem nos preocuparmos com nada além da descrição que estamos criando para este ficheiro.

Mas com nomes de ficheiros, o que mais nos atrapalha não são os caracteres que digitamos, são os espaços entre eles.

Por que os espaços nos nomes de ficheiros do Linux são uma dor

Shells como o Bash interpretarão uma sequência de palavras separadas por espaço como argumentos de comando individuais, não como um único argumento. Aqui está um exemplo, usando touchpara criar um novo ficheiro chamado “meu novo ficheiro.txt”.

toque no meu novo ficheiro.txt
eu
Tentando usar o touch para criar um arquivo com espaços no nome

Como podemos ver, lsnos mostra que existem três ficheiros criados, um chamado “meu”, outro chamado “novo” e mais um chamado “ficheiro.txt”.

Recomendado:  Sua TV Roku está recebendo uma grande atualização

Observe que touchnão reclamou ou gerou um erro. Ele realiza o que acha que estamos pedindo. Portanto, ele nos retorna silenciosamente à linha de comando. Se não estivermos motivados para verificar, não saberemos que as coisas não correram conforme o planejado.

Para criar o ficheiro que desejamos, precisamos citar ou escapar.

Como citar e escapar de espaços

Se citarmos o nome inteiro do ficheiro, touchsabemos que é necessário tratar o texto citado como um único argumento.

toque em 'meu novo ficheiro.txt'
eu
Usando touch para criar um arquivo com espaços em seu nome, com todo o nome do arquivo entre aspas

Desta vez obtemos o ficheiro único que esperamos.

Podemos obter o mesmo resultado se usarmos o caractere de barra invertida ” \” para escapar dos espaços. Ao “escapar” dos espaços, eles não são tratados como caracteres especiais – isto é, separadores de argumentos – eles são considerados espaços simples e antigos.

toque em meu\ segundo\ novo\ ficheiro.txt
eu
Usando o toque para criar um arquivo com espaços em seu nome escapado com barras invertidas

isto funciona, mas escapar de espaços torna a digitação de nomes de ficheiros mais lenta e propensa a erros. As coisas podem ficar muito feias se tu também tiver nomes de diretórios com espaços.

cp diretório um/meu\ texto\ ficheiro.txt diretório\ dois/meu\ ficheiro de texto.bak
eu
Usando espaços de escape em um comando para copiar um arquivo de um diretório para outro

este comando copia um único ficheiro de texto de um diretório chamado “dir one” para um diretório chamado “dir two” e salva a cópia como um ficheiro BAK. E é um exemplo bastante simples.

Como resolver o problema de espaço na sua origem

Se forem seus próprios ficheiros, tu poderá tomar a decisão política de nunca usar espaços e criar (ou renomear em massa ) nomes de ficheiros como este.

meunovoarquivotexto.txt

É certo que é uma solução robusta, mas ainda assim feia. Existem opções melhores, como usar travessões ” -” ou sublinhados ” _” para separar suas palavras.

meu-novo-ficheiro-texto.txt
meu_novo_arquivo_texto.txt

Ambos evitarão o problema e serão legíveis. Se não quiser adicionar caracteres extras aos seus nomes de ficheiros, tu pode usar CamelCase para tornar seus nomes de ficheiros legíveis, assim:

MeuNovoArquivoTexto.txt

A expansão da guia facilita o gerenciamento de espaços

É claro que adotar uma convenção de nomenclatura e segui-la só ajudará quando tu estiver lidando com seus próprios ficheiros. É improvável que ficheiros vindos de qualquer outro lugar sigam a convenção de nomenclatura adotada.

Recomendado:  Use o Google para visualizar personagens 3D de Pac-Man e Anime no seu telefone

tu pode usar a expansão de guias para ajudá-lo a “preencher” nomes de ficheiros com precisão para nós. Digamos que queremos excluir o ficheiro BAK que criamos no “dir dois”, usando rm.

Começamos digitando “rm dir” porque estamos usando o rmcomando e sabemos que o nome do diretório começa com “dir”.

diretório rm
Digitando o início de um comando, antes de pressionar tab para usar o preenchimento de tabulação

Pressionar a tecla “Tab” faz com que o Bash procure correspondências no diretório atual.

Pressionar tab adicionou uma barra invertida e um espaço ao caminho parcial do diretório

Existem dois diretórios que começam com “dir” e em ambos os casos o próximo caractere é um espaço. Então Bash adiciona o caractere de barra invertida ” \” e um espaço. Bash então espera que forneçamos o próximo personagem. É necessário o próximo caractere para diferenciar entre as duas correspondências possíveis neste diretório.

Digitaremos um “t”, para “dois”, e depois pressionaremos “Tab” mais uma vez.

O caminho do diretório após digitar

Bash completa o nome do diretório para nós e espera que digitemos o início do nome do ficheiro.

Temos apenas um ficheiro neste diretório, então digitar a primeira letra do nome do ficheiro, “m”, é suficiente para que o Bash saiba qual ficheiro queremos usar. Digitar “m” e pressionar “Tab” completa o nome do ficheiro para nós, e “Enter” executa o comando inteiro.

Todo o nome do arquivo preenchido pressionando

A expansão de guias facilita a garantia de nomes de ficheiros corretos e também acelera a navegação e a digitação na linha de comando em geral.

Como usar nomes de ficheiros com espaços em scripts Bash

Não é nenhuma surpresa que os scripts tenham exatamente os mesmos problemas com espaços nos nomes de ficheiros que a linha de comando. Se tu estiver passando um nome de ficheiro como uma variável, certifique-se de citar o nome da variável.

Este pequeno script verifica o diretório atual em busca de ficheiros que correspondam ao padrão de ficheiro “*.txt” e os armazena em uma variável chamada file_list. Um forloop é usado para realizar uma ação simples em cada um.

#!/bin/bash

lista_arquivo=*.txt

para ficheiro em $file_list

fazer

  ls -hl $ficheiro

feito

Copie este texto em um editor e salve-o em um ficheiro chamado “files.sh”. Em seguida, use o chmodcomando  para torná-lo executável.

chmod +x ficheiros.sh
Usando chmod para tornar o script executável

Temos alguns ficheiros neste diretório. Um tem um nome de ficheiro simples e os outros dois usam sublinhados ” _” ou travessões ” -” em vez de espaços. isto é o que vemos quando executamos o script.

./ficheiros.sh
Executando o script files.sh com nomes de arquivos sem espaços

isto parece funcionar bem. Mas vamos alterar os ficheiros do diretório por ficheiros que contenham espaços em seus nomes.

./ficheiros.sh
Executando o script files.sh com nomes de arquivos contendo espaços

Cada palavra em cada nome de ficheiro é tratada como se fosse um nome de ficheiro por si só e, portanto, o script falha. Mas tudo o que precisamos fazer para que o script lide com espaços em nomes de ficheiros é citar a $filevariável dentro do forloop.

#!/bin/bash

lista_arquivo=*.txt

para ficheiro em $file_list

fazer

ls -hl "$ficheiro"

feito

Observe que o cifrão ” $” está entre aspas. Fizemos esta alteração e salvamos no ficheiro de script “files.sh”. Desta vez, os nomes dos ficheiros são tratados corretamente.

./ficheiros.sh
O script files.sh modificado manipulando corretamente arquivos com espaços em seus nomes de arquivos

Espaçado, mas não esquisito

Evitar espaços em seus próprios nomes de ficheiros só o levará até certo ponto. É inevitável que tu encontre ficheiros de outras fontes com nomes que contenham espaços. Felizmente, se tu precisar manipular esses ficheiros na linha de comando ou em scripts, existem maneiras fáceis de fazer isto.

Recomendado:  Como impedir que seu iPhone mostre seu número no identificador de chamadas de outras pessoas

Comandos Linux

ficheiros

tar · pv ·  cat · tac · chmod  · grep ·  diff ·  sed · ar ·  man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · cauda · estatística · ls · fstab · echo · menos · chgrp · chown · rev · olhar · strings · digitar · renomear · zip · descompactar · montar · desmontar · instalar · fdisk · mkfs  · rm · rmdir  · rsync  · df  · gpg  · vi  · nano  · mkdir  · du  · ln  · patch  · converter  · rclone · fragmentar · srm  · scp  · gzip · chattr  · cortar  · encontrar  · umask  · wc  ·  tr

Processos

alias  · ecrã ·  topo ·  legal · renice ·  progresso · strace · systemd · tmux · chsh · histórico · em · lote · grátis · which · dmesg · chfn · usermod · ps ·  chroot · xargs · tty · mindinho · lsof · vmstat · tempo limite · parede · sim · matar · dormir · sudo · su · tempo  · groupadd · usermod  · grupos  · lshw  · desligar · reiniciar · parar · desligar  · palavra-passe  · lscpu  · crontab  · data  · bg  · fg  · pidof  · nohup  · pmap

Rede

netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · cavar · dedo · nmap · ftp ·  curl ·  wget  · quem · whoami · w  · iptables  · ssh-keygen  ·  ufw  · arping  · firewalld

RELACIONADO:  Melhores laptops Linux para desenvolvedores e entusiastas