Domanda Come seleziono un campo / colonna dall'output di `ls -l`?


Il mio obiettivo è ingannevolmente 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 di file possano avere un numero variabile di spazi, non tutto nel campo ha 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

enter image description here

in:

enter image description here


17
2017-07-10 01:00


origine




risposte:


Provare ls -l | awk '{print $7}'.

awk seleziona le colonne quindi è perfetto per questo compito.


34
2017-07-10 01:04



Come spiegato da @ormaaj: non fare affidamento su parti di informazioni disponibili in luoghi specifici con ls. Il find il comando è tremendamente utile. - Paddy Landau


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

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

Per la lettura di dati diversi dagli elenchi di nomi di file riga per riga e suddivisione in campi, vedere: BashFAQ / 001

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


16
2017-07-10 01:15





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 @Cura risposta, cut -c44-45 funzionerebbe anche dopo la regolazione (dal ls ha riparato le colonne), o qualsiasi altra cosa, tuttavia il problema principale è che non sarà affidabile e a prova di proiettile (per esempio su Unix potrebbe essere $6no $7, e cambia in base agli argomenti), quindi non è adatto a macchine non è consigliabile analizzare ls comando affatto.

La cosa migliore è usare diversi comandi disponibili come find o stat, che può fornire opzioni pertinenti per formattare l'output di cui hai bisogno. Per 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 su diversi sistemi operativi.


1
2018-04-10 04:27



+1 per menzionare che ls non dovrebbe essere analizzato come pure per l'uso di stat . date tuttavia è configurato in modo errato. Dovresti aggiungere --date=$ymd , da date da solo stamperà il giorno corrente, ma lo scopo qui è quello di convertire il formato della data del file - Sergiy Kolodyazhnyy
Il ls -la | cut -c32-33 Il comando in totale onestà è completamente inaffidabile, non solo a causa delle possibili insidie ​​con i nomi dei file, ma semplicemente perché dipende dalla lunghezza dei nomi degli utenti e dalla dimensione dei file. Il stat -c "%x" *.* il comando sembra ok, ma usando *.* lo stai limitando solo ai nomi di file contenenti un punto. Immagino che l'intenzione fosse di catturare anche i file nascosti; in tal caso dovresti abilitare globbing per dotfile in anticipo e usarlo * invece di *.*: shopt -s dotglob; stat -c "%x" * | [...]. - kos
Ah, e anche quello che ha detto Serg, dovresti aggiungere --date="$ymd" al date comando, altrimenti stamperà il giorno corrente del mese. - kos
Grazie per i commenti. Ho affrontato i problemi e fornito un esempio iniziale migliore. - kenorb