Exemplo útil de ls -b, --escape

7

Sou novo no Ubuntu e estou aprendendo os argumentos ls .

Eu testei o -b, --escape arguments (print C-style escapes for nongraphic characters) , mas não encontrei um exemplo útil de como usá-lo.

Eu criei um arquivo com o nome \*\?\¿\º\ª\?\¿\&\%$\·SpecialCharacterfile.txt usando touch , mas quando eu uso ls ou ls -b , ele lista o mesmo.

*?¿ºª?¿&%$·SpecialCharacterfile.txt

Eu uso o Ubuntu 14.04.5 LTS

    
por Pau Chorro 05.03.2017 / 11:03

4 respostas

13

Todos os seus personagens são gráficos (eles têm glifos visíveis). Tente um nome de arquivo contendo espaços em branco e caracteres invisíveis:

$ touch $'\n\t\b\a\b'
$ ls -b
\n\t\b\a\b
$ echo *


$ printf "%q\n" *
$'\n'$'\t'$'\b'$'\a'$'\b'

Um exemplo útil real em que a saída poderia ser um pouco complicada: nomes de arquivos que acidentalmente tinham o caractere \r inserido neles porque as terminações do arquivo do DOS ficavam no meio de uma operação:

$ od -c file-list 
0000000   s   o   m   e   -   f   i   l   e   .   t   x   t  \r  \n
0000017
$ xargs -a file-list touch
$ ls -b
\n\t\b\a\b  file-list  some-file.txt\r

Eu já vi isso em algum post no U & amp; L. Pessoalmente, eu usaria normalmente ls -q para copiar e colar na própria linha de comando:

$ ls -q
''$'\n\t\b\a\b'  ' '   file-list  'some-file.txt'$'\r'

O comportamento padrão nas versões mais recentes de ls é ls -q para uso interativo: Por que o 'ls' é envolvido de repente itens com espaços entre aspas simples?

    
por muru 05.03.2017 / 11:18
4

Exemplo eu me encontrei

$ touch "Hello This is my file"
$ ls
Hello This is my file

Com -b opção

$ ls -b
Hello\ This\ is\ my\ file

O segundo não é melhor quando quero usar a saída em outro lugar no meu código?

    
por Shreyash S Sarnayak 05.03.2017 / 11:21
4

A maneira como você criou os arquivos foi provavelmente colando o teste diretamente. Para criar arquivos com escapes de contrabarra, você precisa usar o tipo $'...' de citações.

Assim, a criação de arquivos deve ser:

$ touch one$'\n'two  three$'\t'four

E o ls -b nos mostrará sua representação:

$ ls -b                                                    
one\ntwo  three\tfour

Enquanto o padrão ls não será:

$ ls
one?two  three?four

Tenha em atenção que, se as faixas invertidas saírem dos ficheiros, os seus scripts poderão ser quebrados, , portanto, nunca se deve parse ls . E exatamente o objetivo principal de ls -b - ver quais nomes de arquivos têm e potencialmente solucioná-los.

    
por Sergiy Kolodyazhnyy 05.03.2017 / 11:22
4

Além da resposta do muru , que explica que nenhum dos caracteres do seu nome de arquivo é não-gráfico, aponto que seu nome de arquivo não contém nenhuma barra invertida (o shell remove-os quando executa o comando, é claro)

Em caso afirmativo, -b faria com que fossem impressos com escapes:

$ touch 'hi\(zanna' hi\(zanna
$ ls
hi(zanna  hi\(zanna
$ ls -b
hi(zanna  hi\(zanna
    
por Zanna 05.03.2017 / 11:26