Pregunta

Estoy tratando de formatear la salida de ls -la a contener sólo los archivos modificados en diciembre y salida de ellos, muy bien, esto es lo que actualmente se ven como:

ls -la | awk {'print $6,$7,$8,$9,$10'} | grep "Dec" | sort -r | head -5
Dec 4 20:15 folder/
Dec 4 19:51 ./
Dec 4 17:42 Folder\ John/
Dec 4 16:19 Homework\ MAT\ 08/
Dec 4 16:05 Folder\ Smith/

etc ..

¿Cómo puedo configurar algo así como una expresión regular para no incluye cosas como "./" y "../",

También cómo puedo omitir la barra "\" para las carpetas que tienen espacios en ellos. Id como dejar caer la barra al final. ¿Es esto posible a través de un comando shell? O tendría que utilizar Perl para realizar modificaciones a la prueba? Yo quiero la fecha y la hora de seguir siendo como es. Cualquier ayuda sería muy apreciada!

La caja tiene Linux y esto se hace a través de SSH.

Editar:

Esto es lo que tengo hasta ahora (gracias a Mark y gbacon para esto)

ls -laF | grep -vE ' ..?/?$' | awk '{ for (i=6; i<=NF; i++) printf("%s ", $i); printf("\n"); } ' | grep "Dec" | sort -r | head -5

Im sólo tener problemas con la sustitución de "\" con sólo un espacio "". Aparte de eso Gracias por toda la ayuda hasta este punto!

¿Fue útil?

Solución

Puede utilizar find hacer la mayor parte del trabajo por usted:

find -mindepth 1 -maxdepth 1 -printf "%Tb %Td %TH:%TM %f\n" | grep "^Dec" | sort -r

El directorio padre (..) no se incluye por defecto. El -mindepth 1 se deshace del directorio actual (.). Se puede quitar el -maxdepth 1 para que sea recursiva, pero se debe cambiar el %f a %p para incluir la ruta con el nombre de archivo.

Estos son los campos en el -printf:

  • % Tb - nombre corto meses
  • Td% - día del mes
  • % TM:% TM - horas y minutos
  • % f - nombre de archivo

En el grep He añadido un partido para el principio de la línea para que no coincida con un archivo llamado "Decimal" que fue modificada en noviembre, por ejemplo.

Otros consejos

Compruebe y asegúrese de que sus comandos 'ls' no es alias a otra cosa. Por lo general, ls "en bruto" no le dan el / los directorios, ni tampoco se debe escapar de los espacios.

Es evidente que algo está escapando los espacios de por su awk a imprimir esos archivos, desde awk tiende a romperse campo por espacios en blanco, eso es lo que los personajes son de \.

Espacios nombres de los archivos se han diseñado específicamente para frustrar la escritura de guiones sencillos y tuberías mashups como si estuviera tratando de hacer aquí.

Se puede filtrar la salida de ls:

ls -la | grep -vE ' ..?/?$' | awk {'print $6,$7,$8,$9,$10'} | grep "Dec" | sort -r | head -5

Si estás contenido para utilizar Perl:

ls -la | perl -lane 's/\\ / /g;
                     print "@F[5..9]"
                       if $F[8] !~ m!^..?/?$! &&
                          $F[5] eq "Dec"'

Aquí está una de sus respuestas:

  

¿Cómo puedo configurar algo así como una expresión regular para no incluye cosas como "./" y "../",

Uso ls -lA en lugar de ls -la.

En lugar de imprimir un número fijo de columnas, puede imprimir todo, desde la columna 6 l final de la línea:

ls -lA | awk '{ for (i=6; i<=NF; i++) printf("%s ", $i); printf("\n"); } '

No entiendo los espacios barra invertida, por lo que no saben por qué vas a encontrar eso. Para solucionarlo se podría añadir lo siguiente:

| sed 's/\\//g'

¿qué pasa con todos los greps y seds ???

ls -laF | awk '!/\.\.\/$/ && !/\.\/$/ &&/Dec/ { for (i=6; i<=NF; i++) printf("%s ", $i); printf("\n"); }'

así que puede caer . y .. añadiendo grep -v "\." | grep -v "\.\."

No estoy seguro sobre el resto

Realmente me molesta para ver tuberías con awk grep y / sed. Awk es una herramienta muy potente de procesamiento de la línea.

ls -laF | awk '
    / \.\.?\/$/ {next}
    / Dec / {for (i=1; i<=5; i++) $i = ""; print} 
' | sort -r | head -5
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top