Esta pregunta fue provocada por preguntas sobre la ls
' -1
opción y la tendencia recurrente de las personas a hacer preguntas y respuestas que incluyen el procesamiento de la salida de ls
.
Esta reutilización de la salida ls
parece comprensible, por ejemplo: si sabe cómo ordenar una lista de archivos ls
, puede usar la salida de esa manera como entrada para otra cosa.
Si esas preguntas y respuestas no incluyen una referencia a la lista de nombres de archivo producida que consiste en nombres de archivo que se comportan bien (sin caracteres especiales como espacios y líneas nuevas), a menudo alguien los comenta al señalar el peligro de que la secuencia de comandos no funcione cuando hay son archivos con líneas nuevas, espacios, etc.
find
, sort
y otras utilidades resuelven el problema de comunicar nombres de archivo "difíciles", por ejemplo, xargs
mediante el uso de una opción para separar los nombres de archivo con el carácter / byte NUL que no es un carácter válido en el nombre de archivo (¿el único además de /
?) en Sistemas de archivos Unix / Linux.
Miré a la página del manual ls
y la salida para ls --help
(que tiene más opciones enumeradas) y no pude encontrar que ls
(desde coreutils
) tiene una opción para especificar la salida separada por NUL. Tiene una -1
opción que puede interpretarse como "nombres de archivo de salida separados por nueva línea" )
P : ¿Hay ls
alguna razón técnica o filosófica por la que no tiene una opción --zero
u -0
opción que "muestre nombres de archivos separados por NUL"?
Si hace algo que solo genera los nombres de archivo (y no usa, por ejemplo -l
), eso podría tener sentido:
ls -rt -0 | xargs -r0 …
Podría estar perdiendo algo por qué esto no funcionaría, o hay una alternativa para este ejemplo que pasé por alto y que no es mucho más complicada u oscura .
Apéndice:
Hacerlo ls -lrt -0
probablemente no tiene mucho sentido, pero de la misma manera que find . -ls -print0
no lo hace, por lo que no es una razón para no proporcionar una opción -0
/ -z
/ --zero
.
fuente
ls -rtz
Definitivamente sería útil. Contraste la alternativa: superuser.com/a/294164/21402Respuestas:
ACTUALIZACIÓN (2014-02-02)
Gracias a nuestra propia determinación de @ Anthon al seguir la falta de esta función , tenemos una razón un poco más formal de por qué falta esta función, que reitera lo que expliqué anteriormente:
Mi respuesta original
Este es un poco de mi opinión personal, pero creo que es una decisión de diseño para dejar ese cambio
ls
. Si nota que elfind
comando tiene este modificador:Al dejar ese interruptor apagado, los diseñadores estaban insinuando que no debería usar la
ls
salida para nada que no sea el consumo humano. Para el procesamiento posterior por otras herramientas, debe usar en sufind
lugar.Formas de usar find
Si solo está buscando los métodos alternativos, puede encontrarlos aquí, titulados: Hacerlo correctamente: un resumen rápido . Desde ese enlace, estos son probablemente los 3 patrones más comunes:
(Extensiones comunes no estándar -print0 y -0. Funciona en GNU, * BSDs, busybox)
¿Más evidencia?
Encontré esta publicación de blog del blog de Joey Hess titulada: " ls: las opciones que faltan ". Uno de los comentarios interesantes en este post:
Al seguir buscando, encontré esto en los registros de confirmación de uno de los modificadores adicionales que menciona la publicación del blog de Joey, " nuevo formato de salida -j ", por lo que parece que la publicación del blog se estaba burlando de la idea de agregar un
-z
interruptorls
.Referencias
fuente
-0
se implemente) en mi pregunta, para no desviar a las personas.ls -1 | tr '\012' '\000'
se enumerarán los archivos separados por caracteres NULL.Como las respuestas de @ slm van a los orígenes y posibles razones, no repetiré eso aquí. Dicha opción no está en la lista de características rechazadas de coreutils , pero el parche a continuación ahora es rechazado por Pádraig Brady después de enviarlo a la lista de correo de coreutils. De la respuesta está claro que esta es una razón filosófica (la
ls
producción es para consumo humano).Si desea probar si dicha opción es razonable para usted, haga lo siguiente:
luego aplique el siguiente parche contra commit b938b6e289ef78815935ffa705673a6a8b2ee98e dd 2014-01-29:
Después de otra marca puedes probarlo con:
Entonces, el parche funciona y no puedo ver una razón por la que no lo haría, pero eso no es una prueba de que no haya una razón técnica para dejar de lado la opción.
ls -R0
puede que no tenga mucho sentido, pero tampoco lols -Rm
quels
puede hacer fuera de la caja.fuente
-z
y--zero
está más en línea con la clasificación (también en coreutils.