Domanda

Sto cercando di formattare l'output di ls -la per contenere solo i file modificati nel mese di dicembre e li bene in uscita, questo è quello che attualmente assomigliano:

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 ..

Come posso creare qualcosa come un'espressione regolare per non includere cose come "./" e "../",

Inoltre come posso omettere la barra "\" per le cartelle che hanno spazi tra loro. Id piace cadere lo slash alla fine. Questo è possibile attraverso un comando di shell? Oppure avrei dovuto usare Perl per apportare modifiche al test? Io voglio la data e l'ora di rimanere come è. Qualsiasi aiuto sarebbe molto apprezzato!

La scatola ha Linux e questo viene fatto tramite SSH.

Modifica:

Ecco quello che ho finora (grazie a Marco e gbacon per questo)

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

Im solo problemi con la sostituzione "\" con solo uno spazio "". Oltre a questo, grazie per tutto l'aiuto fino a questo punto!

È stato utile?

Soluzione

È possibile utilizzare find per fare la maggior parte del lavoro per voi:

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

La directory genitore (..) non è incluso di default. Il -mindepth 1 si sbarazza della directory corrente (.). È possibile rimuovere il -maxdepth 1 per renderlo ricorsiva, ma si dovrebbe cambiare il %f per %p per includere il percorso con il nome del file.

Questi sono i campi nella -printf:

  • % Tb - nome breve mese
  • % Td - giorno del mese
  • % TM:% TM - ore e minuti
  • % f - filename

Nel grep Ho una corrispondenza per l'inizio della linea in modo da non corrispondere a un file chiamato "decimale" che è stato modificato nel mese di novembre, per esempio.

Altri suggerimenti

Controllare e assicurarsi comando tuoi 'ls' non è alias a qualcos'altro. Tipicamente, ls "grezzi" non ti dà il / per le directory, né deve essere scappando gli spazi.

Evidentemente qualcosa sta sfuggendo gli spazi per voi per il vostro awk per essere la stampa di questi file, dal momento che awk tende a rompere campo da spazi bianchi, questo è ciò che i personaggi sono per \.

Gli spazi sono nomi di file sono progettati specificamente per frustrare la scrittura semplici script e tubi mashup come si sta sta cercando di fare qui.

Si potrebbe filtrare l'output di ls:

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

Se sei contento di utilizzare Perl:

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

Ecco una delle risposte:

  

Come posso creare qualcosa come un'espressione regolare per non includere cose come "./" e "../",

Usa ls -lA invece di ls -la.

Invece di stampare un numero fisso di colonne, è possibile stampare tutto, dalla colonna 6 t alla fine della riga:

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

Non capisco gli spazi backslash, quindi non so il motivo per cui si stanno ottenendo questo. Per risolvere il problema si potrebbe aggiungere questo:

| sed 's/\\//g'

che cosa è con tutti i greps e SED ???

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

e si può cadere . e .. aggiungendo grep -v "\." | grep -v "\.\."

Non sono sicuro circa il resto

E 'veramente mi infastidisce vedere tubazioni con awk e grep / sed. Awk è un potente strumento a riga di elaborazione.

ls -laF | awk '
    / \.\.?\/$/ {next}
    / Dec / {for (i=1; i<=5; i++) $i = ""; print} 
' | sort -r | head -5
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top