Como eu insiro um arquivo ou diretório com caracteres especiais em seu nome?

36

Eu quero entrar na seguinte pasta no terminal:

Milano, Torino (Jan)-Compressed

Como devo escrever o comando cd para entrar neste diretório?

Os espaços e vários outros caracteres especiais como \ , * , ) , ( e ? causam problemas quando tento usá-los na linha de comando ou scripts, por exemplo:

$ cd space dir
bash: cd: space: No such file or directory

$ cat space file
cat: space: No such file or directory
cat: file: No such file or directory

$ cat (
bash: syntax error near unexpected token 'newline'

$ echo content >\
> ^C

$ ls ?
(  )  *  ?  \

Como insiro nomes de arquivos ou diretórios que contêm caracteres especiais no terminal em geral?

    
por Pomario 05.02.2012 / 12:58

8 respostas

38

Esse comando é ambíguo porque os espaços são normalmente usados para separar argumentos. cd não sabe o que você quer fazer, mas você tem duas possibilidades para resolvê-lo:

Ou você " mascara " os espaços (e todos os outros caracteres especiais) para que o terminal saiba que você quer dizer o espaço como um caractere e não como um separador:

cd Milano\,\ Torino\ \(Jan\)-Compressed

Ou coloque o nome da pasta ou o caminho em citações :

cd "Milano, Torino (Jan)-Compressed"
    
por krystoph 05.02.2012 / 13:05
23

Escreva como

cd 'Milano, Torino (Jan)-Compressed'

Caso contrário, ele trata Milano, como o nome da pasta. Isso acontece por causa dos espaços no nome da pasta.

Alternativamente, escape alguns dos caracteres especiais ...

cd Milano\,\ Torino\ \(Jan\)-Compressed/
    
por Prateek 05.02.2012 / 12:59
22

Uma pequena dica: conclusão da guia :)

  1. Basta digitar a primeira letra, por exemplo, cd Mi (ou mais letras, se necessário) e pressionar a tecla Tab . Terminal irá ajudá-lo, completando as palavras restantes.

Outra forma: arrastar e soltar

  1. Se você puder ver o diretório e se quiser acessá-lo usando o terminal, basta digitar: cd primeiro e depois arrastar e soltar o diretório no terminal e pressionar enter .
por Achu 05.02.2012 / 13:35
22

tl; dr : para citar um caractere especial, escape com uma barra invertida \ ou coloque-o em dobro " " ou aspas simples ' ' . Tab ↹ A conclusão cuida da cotação correta.

O que você está pedindo é chamado Citando :

% bl0ck_qu0te%

Citando com o caractere de escape \

% bl0ck_qu0te%

Para inserir um diretório ou um arquivo com um caractere especial, escape do último com \ , por exemplo:

cd space\ dir      # change into directory called “space dir”
cat space\ file    # print the content of file “space file”
echo content > \  # print “content” into file “\”
cat \(             # print the content of file “(”
ls -l \?           # list file “?”
Conclusão programável do pde% (também conhecido como Aba Conclusão) automaticamente escapa caracteres especiais com o caractere de escape bash .

Citando com aspas duplas \

% bl0ck_qu0te%

Portanto, para inserir um diretório ou um arquivo com um caractere especial, escape pelo menos o último ou uma parte maior do seu nome de arquivo ou caminho com aspas duplas, por exemplo:

cd space" "dir     # change into directory called “space dir”
cd spac"e di"r     # equally
cd "space dir"     # equally
cat "space file"   # print the content of file “space file”
cat "("            # print the content of file “(”
ls -l "?"          # list file “?”

Como " " , $ e ' mantêm seu significado especial entre aspas duplas, Expansão do parâmetro , Substituição de Comando , Expansão aritmética e Expansão do histórico são executados em strings de aspas duplas.

Citando com aspas simples !

% bl0ck_qu0te%

Portanto, para inserir um diretório ou um arquivo com um caractere especial, escape pelo menos o último ou uma parte maior do seu nome de arquivo ou caminho com aspas duplas, por exemplo:

cd space' 'dir     # change into directory called “space dir”
cd spac'e di'r     # equal
cd 'space dir'     # equal
cat 'space file'   # print the content of file “space file”
cat '('            # print the content of file “(”
ls -l '?'          # list file “?”
echo content > '\' # print “content” into file “\”

Você pode encontrar mais informações sobre citações em ' ' / QUOTING , em wiki.bash-hackers.org e em tldp.org .

    
por dessert 09.12.2017 / 22:31
10

C-like strings e $ 'string'

Entre outras coisas, pode-se usar o tipo de cotação $'...' para usar os caracteres de barra invertida ANSI-C, como \n e \t , incluindo aqueles que você mencionou. Do manual do bash 4.3:

% bl0ck_qu0te%

Isto é particularmente útil em arquivos que contêm novas linhas, abas, quando você está escrevendo linhas complexas de awk, onde você precisa usar diferentes maneiras de distinguir entre aspas simples e duplas, quando os próprios nomes de arquivos contêm mix simples / duplo etc.

Por exemplo, criar e listar esses arquivos:

$ touch a$'*'b  c$'\n'd                                                     
$ ls  a$'*'b  c$'\n'd                                                       
a*b  c?d

Você pode fazer uso de valores hexadecimais de caracteres, como:

$ touch 'file(name'
$ ls file$'\x28'name
file(name

printf

Mesma ideia de antes - aproveite os caracteres de escape:

$ ls "$(printf "file\x28name")"                                             
file(name
$ echo "Hello World"  >  c$'\n'd                                            
$ cat "$(printf "c\nd")"                                                    
Hello World

Use inodes:

Cada arquivo ou diretório tem uma estrutura de dados especial associada a ele, chamada inode, que é referenciada por um número decimal específico. Assim, você pode usar isso para localizar indiretamente o arquivo com um inode específico por meio do comando find e fazer algo com ele:

$ echo "This is a test" > file$'('name1
$ ls -i
5898996 file(name1  5898997 file?name2
$ find -type f -inum "5898996" -exec cat {} \;
This is a test

Evite lidar com arquivos individuais quando você pode usar glob

Quando você não precisa lidar com arquivos individuais, apenas aproveite o * glob character no shell e cite variáveis ao passá-los para outros comandos. Faz com que lidar com nomes de arquivo difíceis seja muito mais fácil:

$ for f in ./*; do echo "$f" ; done
file    name2
file(name1

Observe o uso de ./ - uma proteção contra nomes de arquivos que podem conter - inicial neles.

    
por Sergiy Kolodyazhnyy 09.12.2017 / 22:43
6

Para abrir uma pasta que contenha um espaço, coloque-a entre aspas como cd "Some Directory" ou escape do espaço com uma barra invertida, como: cd /home/kudic/Radna\ površina .

    
por Corey Whitaker 10.07.2012 / 15:41
3

Se este diretório estiver na sua pasta pessoal, digite:

cd "Milano, Torino (Jan)-Compressed"

mais, dê um caminho absoluto:

cd "/…/…/Milano, Torino (Jan)-Compressed"

se houver uma aspa dupla no nome do arquivo, então escape com \"

    
por Harshveer Singh 05.02.2012 / 13:00
3

Outra opção, embora não seja a melhor neste caso, é usar curingas. Você pode tentar:

cd *Torino*

É melhor usar este método quando houver uma palavra ou frase distinta no nome de um diretório não compartilhado por outros. Por exemplo, eu tenho pontos de montagem / media / DataSSD e / media / DataHDD. O preenchimento automático não funciona até eu digitar quase a metade do nome, então, para chegar à minha partição do disco rígido eu apenas digito

cd /media/*HD*

    
por user242845 02.02.2014 / 18:38