Quiero enumerar todos los archivos (ordenados por fecha) que son más nuevos que la marca de tiempo en formato 20130207003851
en el directorio / tmp solamente. Los subdirectorios pueden omitirse.
Uso de SUSE Linux Enterprise Server 11.
El formato de salida debe ser
S0002948.LOG Feb 7 03:28
S0002935.LOG Feb 7 05:58
S0002952.LOG Feb 7 09:58
S0002940.LOG Feb 7 11:58
find / tmp -newermt "7 feb 2013" -ls enumera los archivos que quiero pero
- ¿Cómo puedo usar la marca de tiempo en un formato 20130207003851
- ¿Cómo puedo ordenar la salida?
- ¿Cómo puedo mostrar solo el nombre y la fecha del archivo? Nombre de archivo primero y luego la fecha?
ps No quiero usar el toque para crear un archivo de referencia para encontrar
pss
find -newermt "20130207003851" -ls
find: I cannot figure out how to interpret `20130207003851' as a date or time
shell-script
find
ls
timestamps
Radek
fuente
fuente
2013007000385
supone que representa? Supongo que 2013 es el año, pero ¿cómo se llega007000385
al 7 de febrero?20130207003851
. No lo copié correctamente o ... perdón por eso.Respuestas:
find
admite muchos formatos de entrada de fecha . El formato más simple para obtener es AAAAMMDD HH: MM: SS. Ya tiene los dígitos en el orden correcto, todo lo que tiene que hacer es extraer el primer grupo (${timestamp%??????}
: tome todos menos los últimos 6 caracteres;:${timestamp#????????}
tome todos menos los primeros 8 caracteres), y continúe, agregando puntuación y luego el siguiente grupo a medida que avanza.En bash (y ksh y zsh), pero no en ash, puede usar la
${STRING_VARIABLE:OFFSET:LENGTH}
construcción más legible .Para ordenar los archivos por fecha, imprima los nombres de archivo precedidos por las fechas y ordénelo, luego elimine el prefijo de la fecha. Use
-printf
para controlar el formato de salida. imprime una parte del tiempo de modificación determinado por ; si es así , obtiene el número de segundos desde la época de Unix. A continuación imprimo tres columnas separadas por tabuladores: la hora en formato ordenable, el nombre del archivo y la hora en formato legible por humanos; elimina la primera columna y la llamada para reemplazar la pestaña por suficientes espacios para acomodar todos los nombres de archivo esperados (ajuste 40 como desee). Este código supone que no tiene líneas nuevas o pestañas en los nombres de archivo.%TX
X
X
@
cut -f 2-
expand
fuente
find -newermt "$timestring" -printf '%M@\t%f %Mb %Md %MH:%MM\n'
me da una salida divertida-rwxrwxrwx@ S0002975.LOG -rwxrwxrwxb -rwxrwxrwxd -rwxrwxrwxH:-rwxrwxrwxM
%T
por el momento,%M
son los permisos.find /tmp -maxdepth 1 -type f -newermt "20130207 00:38:51" -printf '%T@\t%f-%Tb %Td %TH:%TM\n' | sort -k1n | cut -f 2-
que separé el nombre y la hora del archivo-
porque capturaré la salida en php y la usaré como separador. Muchas gracias.Con
zsh
:Las
newer
funciones devuelve true de archivos más recientes que$timestamp
(nota quezsh
'szstat
no es compatible con una precisión por debajo del segundo, aunque).Luego, todo lo que hacemos es usar
zsh
calificadores globales:D
para incluir archivos de puntos,.
para considerar solo archivos regulares,Om
para ordenar el tiempo de modificación y+newer
para llamar a lanewer
función para determinar qué archivo seleccionar.Si desea mostrar también las marcas de tiempo del archivo, puede cambiar
newer
a:Sin embargo, tenga en cuenta que el resultado de la generación del nombre de archivo incluirá las marcas de tiempo, lo que significa que ya no puede usarlas como nombres de archivo.
fuente
ssh
, por ejemplo.