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

44

Quero entrar na seguinte pasta no terminal:

Milano, Torino (Jan)-Compressed

Como devo escrever o comando cdpara entrar neste diretório?

Espaços e vários outros caracteres especiais como \, *, ), (e ?causar problemas quando tento usá-los na linha de comando ou scripts de, 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?

Pomario
fonte
Relacionado: Seção 3.1.2. Citação do manual de referência do Bash .
Eliah Kagan 03/07

Respostas:

43

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

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 personagem e não como um separador:

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

Ou você coloca o nome ou o caminho da pasta entre aspas :

cd "Milano, Torino (Jan)-Compressed"
krystoph
fonte
26

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 Tab. O Terminal ajudará você, completando as demais palavras.

Outra maneira: arrastar e soltar

  1. Se você puder ver o diretório e quiser acessá-lo usando o terminal, digite: cdprimeiro e depois arraste e solte o diretório no terminal e pressione enter.
Achu
fonte
24

Escreva como:

cd 'Milano, Torino (Jan)-Compressed'

Caso contrário, ele será tratado Milano,como o nome da pasta. Isso acontece devido aos espaços no nome da pasta. Como alternativa, escape a alguns dos caracteres especiais:

cd Milano\,\ Torino\ \(Jan\)-Compressed/
Prateek
fonte
22

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


O que você está pedindo é chamado de Citação :

A citação é usada para remover o significado especial de certos caracteres ou palavras do shell. (…) Existem três mecanismos de citação: o caractere de escape , aspas simples e aspas duplas . [citações retiradas de man bash]

Citando com o caractere de escape \

Uma barra invertida não citada ( \) é o caractere de escape. Ele preserva o valor literal do próximo caractere a seguir, com exceção de <newline>.

Portanto, para inserir um diretório ou arquivo com um caractere especial, escape deste ú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 “?”

bashA conclusão programável de (ou seja, Tab ↹conclusão) escapa automaticamente caracteres especiais com o caractere de escape \.

Citando aspas duplas " "

Anexando caracteres entre aspas duplas preserva o valor literal de todos os caracteres entre as aspas, com exceção de $, `, \, e, quando a expansão história está habilitado, !.

Portanto, para inserir um diretório ou arquivo com um caractere especial, escape pelo menos uma parte posterior ou maior do nome do 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 !manter o seu significado especial dentro de aspas duplas, Parâmetro de expansão , comando de substituição , expansão aritmética e história da expansão são realizadas em strings delimitadas por aspas.

Citando aspas simples ' '

Incluir caracteres entre aspas simples preserva o valor literal de cada caractere dentro das aspas. Uma aspas simples pode não ocorrer entre aspas simples, mesmo quando precedida por uma barra invertida.

Portanto, para inserir um diretório ou arquivo com um caractere especial, escape pelo menos uma parte posterior ou maior do nome do 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 cotação em man bash/ QUOTING , no wiki.bash-hackers.org e no tldp.org .

sobremesa
fonte
10

Strings do tipo C e $ 'string'

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

Palavras da forma $ 'string' são tratadas especialmente. A palavra se expande para cadeia, com caracteres de escape com barra invertida substituídos conforme especificado pelo padrão ANSI C.

Isso é particularmente útil em arquivos que contêm novas linhas, guias, quando você está escrevendo linhas awk complexas, nas quais é necessário usar maneiras diferentes de distinguir entre aspas simples e duplas, quando os nomes de arquivos contêm mishmash de aspas simples / duplas, etc.

Por exemplo, criando e listando esses arquivos:

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

Você pode usar valores hexadecimais de caracteres, como:

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

printf

Mesma idéia de antes - tire proveito dos caracteres de escape:

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

Use inodes:

Todo arquivo ou diretório possui uma estrutura de dados especial associada, chamada inode, que é referenciada por um número decimal específico. Portanto, você pode usar isso para localizar indiretamente o arquivo com um inode específico por meio do findcomando, 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 usar o glob

Quando você não precisar lidar com arquivos individuais, basta tirar proveito do *caractere glob no shell e citar variáveis ​​ao passá-los para outros comandos. Torna muito mais fácil lidar com nomes de arquivos difíceis:

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

Observe o uso de ./- uma salvaguarda contra nomes de arquivos que podem conter nomes principais -.

Sergiy Kolodyazhnyy
fonte
6

Para abrir uma pasta que contém um espaço cercá-lo entre aspas como cd "Some Directory"ou escapar do espaço com uma barra invertida, como: cd /home/kudic/Radna\ površina.

Corey Whitaker
fonte
3
Ou escape do espaço com uma barra invertida, como:cd /home/kudic/Radna\ površina
Timo
Ótimo ponto! Eu esqueci de mencionar isso. Normalmente, uso aspas por hábito, mas a barra invertida é realmente melhor usar a longo prazo.
Corey Whitaker
1
Ou use aspas simples ( 'Radna površina'), se você não deseja que variáveis ​​de ambiente ( $VARNAME) sejam expandidas e comandos entre backticks ou $()executados (ou se houver aspas duplas no nome do arquivo).
Eliah Kagan
3

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

cd "Milano, Torino (Jan)-Compressed"

senão dê caminho absoluto:

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

se houver uma citação dupla no nome do arquivo, escape com \"

Harshveer Singh
fonte
Se você iniciar um caminho com uma barra invertida à esquerda, ela sairá da raiz. Você pode querer remover isso.
Isaaclw
@isaaclw É por isso que ele arquivou como um caminho absoluto: P
1
Ah, são três pontos, indicando uma pasta "variável". Eu assumi que eram dois pontos, indicando "pasta pai". Desculpas.
Isaaclw
3

Outra opção, embora não seja a melhor nesse caso, é usar caracteres curinga. Podes tentar:

cd *Torino*

É melhor usar esse método quando houver uma palavra ou frase distinta no nome de um diretório não compartilhado por outras pessoas. Por exemplo, tenho pontos de montagem / media / DataSSD e / media / DataHDD. O preenchimento automático não funciona até que eu digite quase metade do nome. Para acessar minha partição do disco rígido, basta digitar

cd /media/*HD*

user242845
fonte