O que significa o (?) ao usar o utilitário ls?

6

Estou usando o utilitário ls e meu comando é assim:

$ ls x?[a-c]*

Qual é a saída desse comando? Até agora eu entendo (e espero que esteja certo) que listará itens que:

  • começar com x
  • a terceira letra é {a, b, c}
  • nada após a terceira letra, não importa, está incluído

Minha pergunta é, o que o ? (ponto de interrogação) representa? Qual é a condição?

Obrigado antecipadamente.

    
por clifer4 17.06.2018 / 16:40

1 resposta

11

Não é um recurso ls , é um recurso bash e é descrito no Seção "Correspondência de padrões" em bash (1) :

The special pattern characters have the following meanings:

*

      Matches any string, including the null string.  When the globstar shell option is enabled, and * is used in a pathname expansion context, two adjacent *s used as a single pattern will match all files and zero or more directories and subdirectories.  If followed by a /, two adjacent *s will match only directories and subdirectories.
?
      Matches any single character.
[...]
      Matches any one of the enclosed characters.  A pair of characters separated by a hyphen denotes a range expression; any character that falls between those two characters, inclusive, using the current locale's collating sequence and character set, is matched.  If the first character following the [ is a ! or a ^ then any character not enclosed is matched.  The sorting order of characters in range expressions is determined by the current locale and the values of the LC_COLLATE or LC_ALL shell variables, if set.  To obtain the traditional interpretation of range expressions, where [a-d] is equivalent to [abcd], set value of the LC_ALL shell variable to C, or enable the globasciiranges shell option.  A - may be matched by including it as the first or last character in the set.  A ] may be matched by including it as the first character in the set.

Seu entendimento também não está totalmente correto - ? significa qualquer caractere, então a expressão x?[a-c]* corresponderia a xQcFoo.bar , xmabc e x1a , mas também xabc - o ponto é que {a,b,c} também pode ser a segunda letra, não apenas a terceira. A saída do comando ls x?[a-c]* será uma lista de arquivos que correspondem x?[a-c]* padrão. Ou, se não houver tais arquivos, o shell não substituirá x?[a-c]* por nada, então ls tentará listar o arquivo literalmente denominado x?[a-c]* .

    
por 17.06.2018 / 16:49