Quando a saída vai para um dispositivo terminal, a maioria das ls implementações se comportam como se a opção -q tivesse sido passada para elas.
Com -q , ls renderiza todos os caracteres não imprimíveis como ?
Aqui, possivelmente, o caractere não imprimível pode ser um caractere de retorno de carro (também conhecido como CR, também conhecido como \r ). Isso poderia acontecer, por exemplo, se você executasse xargs touch < file.txt e file.txt continha uma lista de nomes de arquivos, mas estivesse usando delimitadores de linha MS-DOS CR-LF (e sua implementação xargs como GNU xargs , mas ao contrário de busybox xargs não reconhece CR como um separador).
Também pode ser literalmente um caractere ? , pode até ser um ? seguido por espaço ou outros caracteres invisíveis (mas imprimíveis ).
Para confirmar qual caractere é, você pode canalizar essa saída para LC_ALL=C sed -n l .
ls -l | LC_ALL=C sed -n l
Em seguida, a saída ls será um canal (e, portanto, não será mais um dispositivo terminal), portanto, não ativará -q . Os caracteres não imprimíveis serão impressos como estão. sed -n l renderizará caracteres CR como \r e outros caracteres não imprimíveis usando representações imprimíveis apropriadas. Ele também adiciona um $ no final da linha para que você possa identificar caracteres de espaço à direita.
Com a implementação GNU de ls , você também pode usar algumas das opções --quoting-style=<STYLE> , como:
LC_ALL=C ls --quoting-style=shell-escape -l
Ou
LC_ALL=C ls -Ql
curto para:
LC_ALL=C ls --quoting-style=c -l