Come faccio a selezionare un campo / colonna dall'output di 'ls -l'?

17

Il mio obiettivo è apparentemente semplice (almeno per me). Desidero prendere l'output di ls -l o ls -lh e selezionare solo un campo.

Sto cercando questo per essere il più antiproiettile possibile, con il quale intendo, supponiamo che i nomi dei file possano avere un numero variabile di spazi, non tutto nel campo abbia la stessa lunghezza, ecc.

Punti bonus per avere uno script che assumerà il nome del campo (o anche solo un numero di campo), quindi restituirà il contenuto del campo.

Voglio girare

in:

    
posta soandos 10.07.2012 - 03:00

3 risposte

32

Prova ls -l | awk '{print }' .

awk seleziona le colonne quindi è perfetto per questa attività.

    
risposta data Corey Whitaker 10.07.2012 - 03:04
16

Non analizzare mai ls . Usa GNU find . O se la portabilità non è importante, stat(1) .

find . -maxdepth 1 -printf '%Td\n'

Per leggere i dati diversi dagli elenchi di nomi di file riga per riga e suddividerli nei campi, consulta: BashFAQ / 001

Non ci sono metodi per leggere in modo affidabile un elenco di nomi di file delimitati da una nuova riga che abbiano senso nella maggior parte delle circostanze.

    
risposta data ormaaj 10.07.2012 - 03:15
1

Puoi recuperare la colonna specifica nella shell come:

ls -al | while read perm bsize user group size month day time file; do echo $day; done

o awk come mostrato in @Corey answer , cut -c44-45 funzionerebbe anche dopo la regolazione (poiché ls ha colonne fisse) o qualsiasi altra cosa, tuttavia il problema principale è che non sarà affidabile e a prova di proiettile (ad esempio su Unix potrebbe essere , non , e cambia a seconda degli argomenti) non rendendolo Per questo motivo, non è consigliabile analizzare parecchio il comando ls .

La cosa migliore è usare diversi comandi disponibili come find o stat , che possono fornire opzioni rilevanti per formattare l'output secondo le tue necessità. Ad esempio:

$ stat -c "%x %n" *
2016-04-10 04:53:07.000000000 +0100 001.txt
2016-04-10 05:08:42.000000000 +0100 7c1c.txt

Per restituire la colonna dei soli giorni di modifiche, prova questo esempio:

stat -c "%x" * | while read ymd; do date --date="$ymd" "+%d"; done

Vale la pena notare che GNU stat potrebbe avere diverse opzioni per BSD stat , quindi non sarà ancora a prova di proiettile tra diversi sistemi operativi.

    
risposta data kenorb 10.04.2016 - 06:27

Leggi altre domande sui tag