Categories: Tecnologia

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

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

O humilde nome do arquivo

Tudo armazenado no disco rígido do seu computador precisa ter um nome. Sem um nome, nenhum arquivo existiria. Todos os aplicativos e daemons iniciados quando o computador é inicializado e todo o software que você usa devem ser identificados e armazenados em um sistema de arquivos. Essa identificação é o nome do arquivo.

O mesmo se aplica aos arquivos que você cria ou instala. Todos os seus documentos, imagens e músicas precisam de nomes de arquivo. Sem nomes de arquivos, nenhum dos seus ativos digitais poderia existir. Como os nomes dos arquivos 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 arquivo 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 arquivo na posição do caractere nulo. O “

 / 

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

Os nomes de arquivos 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 arquivo de oito caracteres, além de uma extensão de três caracteres .

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

Mas com nomes de arquivos, 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 arquivos 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 arquivo chamado “meu novo arquivo.txt”.

toque no meu novo arquivo.txt

eu

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

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 arquivo que desejamos, precisamos citar ou escapar.

Como citar e escapar de espaços

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

toque em 'meu novo arquivo.txt'

eu

Desta vez obtemos o arquivo ú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\ arquivo.txt

eu

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

cp diretório um/meu\ texto\ arquivo.txt diretório\ dois/meu\ arquivo de texto.bak

eu

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

Como resolver o problema de espaço na sua origem

Se forem seus próprios arquivos, você poderá tomar a decisão política de nunca usar espaços e criar (ou renomear em massa ) nomes de arquivos 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-arquivo-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 arquivos, você pode usar CamelCase para tornar seus nomes de arquivos 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 você estiver lidando com seus próprios arquivos. É improvável que arquivos vindos de qualquer outro lugar sigam a convenção de nomenclatura adotada.

Você pode usar a expansão de guias para ajudá-lo a “preencher” nomes de arquivos com precisão para nós. Digamos que queremos excluir o arquivo 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

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

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.

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

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

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

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

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

Este pequeno script verifica o diretório atual em busca de arquivos que correspondam ao padrão de arquivo “*.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 arquivo em $file_list

fazer

  ls -hl $arquivo

feito

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

chmod +x arquivos.sh

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

./arquivos.sh

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

./arquivos.sh

Cada palavra em cada nome de arquivo é tratada como se fosse um nome de arquivo 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 arquivos é citar a $filevariável dentro do forloop.

#!/bin/bash

lista_arquivo=*.txt

para arquivo em $file_list

fazer

ls -hl "$arquivo"

feito

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

./arquivos.sh

Espaçado, mas não esquisito

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

Comandos Linux

arquivos

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  · tela ·  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  · senha  · 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

maisroot

Recent Posts

O novo aplicativo “PC Manager” da Microsoft se parece muito com o CCleaner

Muitos aplicativos de limpeza estão disponíveis para Windows ao longo dos anos, mas hoje em…

1 ano ago

Como reiniciar um PS4

Seu PlayStation 4 está congelado? Seus jogos favoritos continuam travando? Reiniciar seu PS4 pode resolver…

1 ano ago

Veja por que as reticências são tão assustadoras ao enviar mensagens de texto…

A popularidade das mensagens de texto significou aprender uma forma totalmente nova de comunicação. Você…

1 ano ago

O telescópio James Webb acaba de capturar os “Pilares da Criação”

A foto dos "Pilares da Criação" tirada pelo Telescópio Espacial Hubble é uma das fotos…

1 ano ago

Você poderá baixar o Proton Drive mais cedo do que pensa

O Proton Drive saiu de seu estágio beta há algumas semanas, mas o aplicativo real…

1 ano ago

Como aumentar o zoom no Photoshop

Para ver suas fotos mais de perto ou para uma edição precisa , você pode…

1 ano ago