¿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 **/*(.)
ls
ordenaría.Respuestas:
Supongo que sus nombres de archivo no contienen nuevas líneas.
Usar en
+
lugar de;
terminar la-exec
acción lo hace más rápido al agrupar las invocaciones dels
. Puede ordenar por canalización a través delsort
comando; 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-n
le indicals
que 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
zargs
ejecutarlosls
varias veces si la línea de comando es demasiado larga. Necesitas GNUls
(específicamente su-f
opción) para evitar reordenar porls
(otro enfoque sería emularls
con 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
-l
listado ú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 -q
opción también especificada POSIX , es relativamente fácil preparar una expresión regular para unls
resultado sinfind
nada:grep
para 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:ls
las opciones consisten en:-a
devolver todos los archivos en un directorio, incluidos los que comienzan con un.dot
-l
listado largo-R
enumerar recursivamente todos los directorios secundarios-c
mostrar el tiempo de modificación en lugar del tiempo de acceso-q
devolver el globo de shell en?
lugar de caracteres no imprimibles o\t
ab en un nombre de archivoEsos resultados se pasan sobre el
|pipe
archivo alsed
que solo coincide:-
(en otras palabras, nod
para 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,cron
por supuesto, pero, hey, sus opciones están abiertas.En cualquier caso, esto ofrece algunas ventajas significativas sobre otras posibles soluciones.
En primer lugar,
find
+ls
implica múltiples invocaciones: esto solo implica un únicols
proceso, y es por eso que es capaz de clasificar todo de manera confiable, lo que hace de manera predeterminada, ysort
también se hace auxiliar.Cualquier solución que involucre
find
ysort
yals
está haciendo casi todo el trabajo dos veces.ls
yfind
ambos resolverán cada ruta ystat
cada archivo.ls
ysort
ambos ordenarán todos los resultados. Probablemente sea mejor usar el sencillols
.Luego, por supuesto, están las partes
date
ysed
de 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
date
cadena que estamos buscandogrep
pero 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 -lt
find
buscará recursivamente todos los archivos en el directorio actual.ls
comando en una sola llamada (siemprefind
devuelve menos que losARG_MAX
archivos).ls -lt
ordenará estos archivos por hora y formateará la salidaPara recuperar su sistema
ARG_MAX
, puede escribir:fuente
fuente
ls
hace su propia clasificación, por lo que canalizar la salida defind
throughsort
es 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.