¿Es posible la salida de orden find … -exec ls -ls ;alfabético, por nombre de archivo?
Este es mi comando cron:
find /home/setefgge/public_html -type f -ctime -1 -exec ls -ls {} \;
Este comando funciona bien, en su mayor parte. Pero los resultados no están ordenados en ninguna secuencia significativa. Sería muy útil si se ordenaran por el campo de nombre de archivo.

ls -ls **/*(.)lsordenaría.Respuestas:
Supongo que sus nombres de archivo no contienen nuevas líneas.
Usar en
+lugar de;terminar la-execacción lo hace más rápido al agrupar las invocaciones dels. Puede ordenar por canalización a través delsortcomando; dígale que comience a ordenar en el décimo campo (los primeros 9 son los metadatos: bloques, permisos, recuento de enlaces, usuario, grupo, tamaño y 3 campos de fecha / hora). La opción-nle indicalsque use valores numéricos para el usuario y el grupo, lo que evita el riesgo de que los nombres de usuarios o grupos contengan espacios en blanco.Alternativamente, con zsh, puede escapar sin suponer ningún nombre utilizando calificadores globales para recopilar y ordenar los archivos y
zargsejecutarloslsvarias veces si la línea de comando es demasiado larga. Necesitas GNUls(específicamente su-fopción) para evitar reordenar porls(otro enfoque sería emularlscon zshzstat).fuente
¿Por qué no canalizar el resultado de find through sort y luego ejecutar ls para cada una de las líneas?
fuente
POSIX tiene esto que decir sobre las fechas en un
ls-llistado único:Teniendo esto en cuenta, y asegurándose de que si hay líneas nuevas en un nombre de archivo que estén correctamente bloqueadas con la
ls -qopción también especificada POSIX , es relativamente fácil preparar una expresión regular para unlsresultado sinfindnada:greppara eso y solo devolverá líneas que contienen las cadenas que representan las fechas de hoy o de ayer. El siguiente comando se suma a eso un poco:lslas opciones consisten en:-adevolver todos los archivos en un directorio, incluidos los que comienzan con un.dot-llistado largo-Renumerar recursivamente todos los directorios secundarios-cmostrar el tiempo de modificación en lugar del tiempo de acceso-qdevolver el globo de shell en?lugar de caracteres no imprimibles o\tab en un nombre de archivoEsos resultados se pasan sobre el
|pipearchivo alsedque solo coincide:-(en otras palabras, nodpara el directorio) que también contienen sudate.El resultado se ve así:
Sí, incluso funciona
LS_COLORS, lo que probablemente es una prioridad baja para usted,cronpor supuesto, pero, hey, sus opciones están abiertas.En cualquier caso, esto ofrece algunas ventajas significativas sobre otras posibles soluciones.
En primer lugar,
find+lsimplica múltiples invocaciones: esto solo implica un únicolsproceso, y es por eso que es capaz de clasificar todo de manera confiable, lo que hace de manera predeterminada, ysorttambién se hace auxiliar.Cualquier solución que involucre
findysortyalsestá haciendo casi todo el trabajo dos veces.lsyfindambos resolverán cada ruta ystatcada archivo.lsysortambos ordenarán todos los resultados. Probablemente sea mejor usar el sencillols.Luego, por supuesto, están las partes
dateysedde esta respuesta. Lo importante a tener en cuenta al respecto es que haces la parte difícil y obtienes la expresión regular primero, y solo una vez, y luego solo podas una lista de resultados en lugar de decir, obtener resultados, obtener resultados, ordenar resultados y ordenar resultados.Esto no se rompe en los nombres de archivo que contienen nuevas líneas, como probablemente lo harán otras soluciones. Esta solución tiene sus propias advertencias, que explico a continuación, pero son minuciosas y fáciles de manejar. En mi opinión, esta es la solución más sólida aquí.
Hay dos casos en los que el comando anterior puede causarle problemas. El primero involucra los
?globos en los nombres de archivo, mientras que ya es una solución más sólida que cualquier otra que se ofrezca aquí, y la probabilidad de que encuentres una?es bastante pequeña por sí sola, existe la posibilidad de resolver esos globos. podría coincidir con más de un nombre de archivo. Consulte esto para obtener más información sobre este tema.La otra posibilidad implica un falso positivo, por ejemplo, si tiene un nombre de archivo que realmente coincide con la
datecadena que estamos buscandogreppero que en realidad no se modificó en ninguno de esos días. No cuento con que eso sea un problema, pero, si lo es, pregunte al respecto y probablemente pueda ayudarlo a hacer que la expresión regular sea más específica para manejar esto.fuente
En realidad, puede usar una combinación de find, xargs y ls.
Aquí hay un comando de muestra:
find . -type f -print0 | xargs -0 ls -ltfindbuscará recursivamente todos los archivos en el directorio actual.lscomando en una sola llamada (siemprefinddevuelve menos que losARG_MAXarchivos).ls -ltordenará estos archivos por hora y formateará la salidaPara recuperar su sistema
ARG_MAX, puede escribir:fuente
fuente
lshace su propia clasificación, por lo que canalizar la salida defindthroughsortes inútil. Además, su comando manipula los nombres de archivo que contienen espacios en blanco (entre otros) y fallará si hay demasiados nombres de archivo.