Esto me ha estado volviendo loco...
Quiero enumerar archivos en un directorio y, según el número de interacción de todos los archivos excepto el más reciente, aquí está el fragmento de código.
FILECOUNT=$(ls -lt [dir]*.log | grep -c .log )
for (( c=2; c<=$FILECOUNT; c++ ))
do
FILEDIR=$("ls -1t [dir]*.log | sed -n '$c p'")
He tenido problemas con $c
la interpretación, el formato anterior funciona pero el comando sed falla... aunque ingresar la última línea del registro en el cli funciona de maravilla
FILECOUNT=24
(( c=2 ))
(( c<=24 ))
C is : 2
'ls -1t [dir]*.log | sed -n '\''2 p'\'''
line 41: ls -1t [dir]*.log | sed -n '2 p': No such file or directory
¡Cualquier ayuda sería muy apreciada!
obviamente es [dir]
un directorio válido
Respuesta1
El principal problema que tienes es que pones todo en la sustitución del comando entre comillas dobles:
FILEDIR=$("ls -1t [dir]*.log | sed -n '$c p'")
Esto le indicaría al shell que localice un archivo ejecutable connombre literal ls -1t [dir]*.log | sed -n '$c p'"
y sin argumentos, a diferencia de ejecutar el comando ls
con opciones -1t
y operando [dir]*.log
cuya salida se canalizará al ejecutable sed
con opción -n
y argumento '$c p'
. Intente eliminar las comillas dobles, como en
FILEDIR=$(ls -1t [dir]*.log | sed -n '$c p')
Sin embargoentonces enfrentará el problema de que la expansión de variables está deshabilitada en su sed
comando entre comillas simples. Unomanera recomendadaes romper el argumento de comillas simples y colocar la variable entre comillas dobles, como en
FILEDIR=$(ls -1t [dir]*.log | sed -n "$c"' p')
Además, debo emitir la advertencia obligatoria.no analizar la salida dels
. ;)