Essa pergunta foi motivada por perguntas sobre ls
a -1
opção ' e a tendência recorrente das pessoas de fazer perguntas e respostas que incluem o processamento da saída de ls
.
Essa reutilização da saída ls
parece compreensível, por exemplo: se você souber classificar uma lista de arquivos, ls
poderá usar a saída dessa maneira como entrada para outra coisa.
Se essas perguntas e respostas não incluírem uma referência à lista de nomes de arquivos produzida com nomes de arquivos com bom comportamento (sem caracteres especiais, como espaços e novas linhas), eles são frequentemente comentados por alguém apontando o perigo de a sequência de comandos não funcionar quando houver são arquivos com novas linhas, espaços etc.
find
, sort
e outros utilitários resolvem o problema de comunicar nomes de arquivos "difíceis", xargs
por exemplo , usando uma opção para separar os nomes de arquivo com o caractere / byte NUL que não é um caractere válido no nome do arquivo (o único além de /
?) em Sistemas de arquivos Unix / Linux.
Procurei na página de manual ls
e na saída ls --help
(que tem mais opções listadas) e não consegui descobrir que ls
(de coreutils
) tem uma opção para especificar saída separada por NUL. Ele possui uma -1
opção que pode ser interpretada como "nomes de arquivos de saída separados por nova linha" )
P : Há razões técnicas ou filosóficas pelas quais ls
não existe uma opção --zero
ou -0
que "produza nomes de arquivos separados por NUL"?
Se você fizer algo que apenas exiba os nomes dos arquivos (e não use, por exemplo -l
) que possa fazer sentido:
ls -rt -0 | xargs -r0 …
Eu poderia estar perdendo algo por que isso não funcionaria, ou existe uma alternativa para este exemplo que eu ignorei e que não é muito mais complicado e / ou obscuro .
Termo aditivo:
Fazer ls -lrt -0
provavelmente não faz muito sentido, mas da mesma maneira que find . -ls -print0
não, portanto não é um motivo para não fornecer uma opção -0
/ -z
/ --zero
.
fonte
ls -rtz
definitivamente seria útil. Compare a alternativa: superuser.com/a/294164/21402Respostas:
ATUALIZAÇÃO (02-02-2014)
Graças à nossa determinação do @ Anthon em acompanhar a falta desse recurso , temos uma razão um pouco mais formal para a falta desse recurso, o que reitera o que expliquei anteriormente:
Minha resposta original
Isso é um pouco da minha opinião pessoal, mas acredito que seja uma decisão de projeto deixar essa mudança de lado
ls
. Se você perceber que ofind
comando possui esta opção:Ao deixar essa opção de fora, os designers sugeriram que você não deveria usar a
ls
saída para outra coisa senão o consumo humano. Para processamento a jusante por outras ferramentas, você deve estar usandofind
.Maneiras de usar o find
Se você está apenas procurando os métodos alternativos, pode encontrá-los aqui, intitulado: Fazendo corretamente: Um resumo rápido . Nesse link, esses são provavelmente os três padrões mais comuns:
(extensões comuns fora do padrão -print0 e -0. Funciona em GNU, * BSDs, busybox)
Evidência futura?
Eu encontrei esta postagem do blog de Joey Hess, intitulada: " ls: as opções ausentes ". Um dos comentários interessantes neste post:
Em pesquisas adicionais, encontrei isso nos logs de confirmação de uma das opções adicionais mencionadas no blog de Joey, " novo formato de saída -j ", de modo que parece que a postagem do blog estava zombando da idéia de adicionar uma
-z
opção aols
.Referências
fonte
-0
seja implementado) na minha pergunta, a fim de não desviar as pessoas.ls -1 | tr '\012' '\000'
listará os arquivos separados por caracteres NULL.Como as respostas do @ slm vão para as origens e possíveis razões, não repetirei isso aqui. Essa opção não está na lista de recursos rejeitados do coreutils , mas o patch abaixo agora é rejeitado por Pádraig Brady após enviá-lo para a lista de discussão do coreutils. Pela resposta, fica claro que essa é uma razão filosófica (a
ls
produção é para consumo humano).Se você quiser experimentar se essa opção é razoável, faça o seguinte:
em seguida, aplique o seguinte patch ao commit b938b6e289ef78815935ffa705673a6a8b2ee98e dd 2014-01-29:
Depois de outro make, você pode testá-lo com:
Portanto, o patch funciona e não vejo uma razão para isso, mas isso não é prova de que não há razão técnica para deixar de fora a opção.
ls -R0
pode não fazer muito sentido, mas também ols -Rm
quels
pode ser feito imediatamente.fonte
-z
e--zero
é mais em linha com a espécie (também em coreutils.