![Encuentre archivos creados después de un tiempo particular en csh en SunOS](https://rvso.com/image/231043/Encuentre%20archivos%20creados%20despu%C3%A9s%20de%20un%20tiempo%20particular%20en%20csh%20en%20SunOS.png)
En mi sistema SunOS, intento encontrar todos los archivos creados después de las 7 p.m. usando csh
, ls
y 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 ksh
pero no en csh
. ¿Cómo puedo lograr esto en csh
?
Nota: -newermt
la opción no es compatible con find
SunOS, así que intenté usar el ls
comando 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 csh
si $Source_files_Dir
contiene caracteres de nueva línea. Reemplazar "$Source_files"
con $Source_files:q
sería mejor en csh (pero ya no funciona en otros shells).
Normalmente también se tendría zsh
instalado 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_Dir
comienza con-
, será tratado como una opción porls
. 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
ls
con datos globales o generalmente variables, generalmente desea usar la-d
opción:ls -ld -- ...
- Específicamente en csh, si
$Source_files_Dir
contiene caracteres de nueva línea, provocará un error de sintaxis.$Source_files_Dir:q
es 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 -l
también informan) no contienen caracteres de nueva línea mientras procesa la salidals
basada 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
-n
en lugar de (o además de)-l
para obtener uid/gids numéricos lo haría más sólido (y evitaría la traducción potencialmente costosa a nombres). date +%d
genera un número rellenado con 0, mientras que con muchasls
implementaciones y en muchas configuraciones regionales (y ese es un requisito POSIX en la configuración regional C/POSIX),ls -l
genera un número rellenado con espacios (date +%e
).ls -l
resultadosMon dd HH:MM
para fechas recientes, no en el futuro, sinoMon dd YYYY
para otras que su enfoque no maneja.- sin la
-L
opció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.perl
Losstat()
ozsh
funcionanage
con 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
xargs
en 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 match
error yls
no se ejecutará (lo cual al menos es mejor que el comportamiento estilo Bourne dondels
se llama con el patrón literalmente), peroxargs
aún así se ejecutará. ejecutar, ybasename
seguirá ejecutándose una vez sin ningún argumento que pueda causar un error confuso.
Respuesta2
Obtuve una respuesta para csh, en lugar de '$'
usar backticks
la fecha almacenada de hoy en una variable today
en 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