Encuentre archivos creados después de un tiempo particular en csh en SunOS

Encuentre archivos creados después de un tiempo particular en csh en SunOS

En mi sistema SunOS, intento encontrar todos los archivos creados después de las 7 p.m. usando csh, lsy awk.

ls -l  "${Source_files_Dir}"/*.zip| awk -v today="$(date "+%b %d")" '{
date=$6" "$7; time=$8; if (date == today && substr(time,1,2) >= 19)
print $9 }'|xargs -n 1 basename

Este comando funciona kshpero no en csh. ¿Cómo puedo lograr esto en csh?

Nota: -newermtla opción no es compatible con findSunOS, así que intenté usar el lscomando anterior.

Respuesta1

Ese enfoque es bastante extraño de todos modos, sería mejor que usaras perl:

perl -MPOSIX -MFile::Basename -le '@start = localtime; @start[0..2] = (0,0,19); $start = mktime(@start); for (@ARGV) {print basename$_ if @s = stat$_ and $s[9] >= $start}' -- "$Source_files_Dir"/*.zip

No estoy seguro de por qué usarías csh en este siglo, pero ten en cuenta que lo anterior no funciona correctamente cshsi $Source_files_Dircontiene caracteres de nueva línea. Reemplazar "$Source_files"con $Source_files:qsería mejor en csh (pero ya no funciona en otros shells).

Normalmente también se tendría zshinstalado Solaris (anteriormente conocido como SunOS), donde sólo es cuestión de hacer:

autoload age
print -rC1 -- $Source_files_Dir/*.zip(Ne[age 19:00]:t)

Enumerando algunos de los problemas con su enfoque:

  • ls -l "${Source_files_Dir}"/*.zip: si $Source_files_Dircomienza con -, será tratado como una opción por ls. Generalmente, es necesario --marcar el final de las opciones si lo que sigue es variable.
  • Si alguno de los archivos zip es de tipo directorio, se enumerará su contenido. Cuando se usa lscon datos globales o generalmente variables, generalmente desea usar la -dopción:ls -ld -- ...
  • Específicamente en csh, si $Source_files_Dircontiene caracteres de nueva línea, provocará un error de sintaxis. $Source_files_Dir:qes mejor en csh como se señaló anteriormente.
  • En cualquier caso, está asumiendo que las rutas de los archivos (nombres de archivos y destinos de enlaces simbólicos que ls -ltambién informan) no contienen caracteres de nueva línea mientras procesa la salida lsbasada en líneas.
  • Está asumiendo que la fecha/hora está en los campos 6, 7, 8, que se desharán si los nombres de usuarios o grupos contienen espacios en blanco. Usar -nen lugar de (o además de) -lpara obtener uid/gids numéricos lo haría más sólido (y evitaría la traducción potencialmente costosa a nombres).
  • date +%dgenera un número rellenado con 0, mientras que con muchas lsimplementaciones y en muchas configuraciones regionales (y ese es un requisito POSIX en la configuración regional C/POSIX), ls -lgenera un número rellenado con espacios ( date +%e).
  • ls -lresultados Mon dd HH:MMpara fechas recientes, no en el futuro, sino Mon dd YYYYpara otras que su enfoque no maneja.
  • sin la -Lopción, para los enlaces simbólicos, lo que se enumerará será la hora de modificación del enlace simbólico, a diferencia de la del archivo zip al que apunta. perlLos stat()o zshfuncionan agecon el mtime del objetivo.
  • con su {print $9}, además de los nombres de usuarios/grupos que no contienen espacios en blanco, asume que las rutas de los archivos tampoco los contienen.
  • el uso xargsen esa salida sin formato fallará si las rutas de los archivos contienen barras invertidas o comillas, y al no ejecutarlo en la configuración regional C, en nombres de archivos que no son texto codificado en la codificación local.
  • Si no hay ningún archivo zip no oculto en el directorio, en csh, obtendrá un No matcherror y lsno se ejecutará (lo cual al menos es mejor que el comportamiento estilo Bourne donde lsse llama con el patrón literalmente), pero xargsaún así se ejecutará. ejecutar, y basenameseguirá ejecutándose una vez sin ningún argumento que pueda causar un error confuso.

Respuesta2

Obtuve una respuesta para csh, en lugar de '$'usar backticksla fecha almacenada de hoy en una variable todayen lugar de ingresarla awk.

set today=`date "+%b %d"`
ls -l "$Source_files_Dir"/*.zip | awk -v today="$today" ' \
{ \
    date=$6" "$7; \
    time=$8; \
    if (date == today && substr(time,1,2) >= 19) print $9; \
}'|xargs -n 1 basename

información relacionada