Come echo solo 1 colonna di output dal comando ls?


55

Diciamo che quando faccio il comando ls l'output è:

file1 file2 file3 file4

È possibile visualizzare solo una determinata colonna di output, in questo caso file2? Ho provato quanto segue senza successo:

echo ls | $2

Fondamentalmente tutto quello che voglio fare è fare eco solo alla seconda colonna, in questo caso, voglio fare eco:

file2

2
Qual è una situazione in cui vuoi davvero una colonna di lsoutput?
michas,

11
Come regola generale, non dovresti mai analizzare ls . Ci sono quasi sempre modi migliori per ottenere le informazioni di cui hai bisogno.
terdon

Non farei quello sconosciuto: P (mi dispiace che mi sia sempre piaciuta quella frase) il numero di colonne dipende dai nomi dei file e delle cartelle, quindi la seconda colonna potrebbe essere quella che vuoi, o no, o potrebbe essere in una lse dopo aver creato alcuni file / cartelle potrebbe non essere più quello che desideri. Come ha sottolineato Terdon, ci sono sicuramente modi migliori per ottenere ciò che desideri
YoMismo,

Risposte:


83

Il seguente comando formatterà l'output in una colonna

ls -1 /directory

2
Ma non ti dà solo la colonna a cui è interessato l'OP.
Anthon,

1
Per renderlo corretto: ls -1 /directory | head -2 | tail -1oppurels -1 /directory | perl -ne 'print if $. == 2'
KWubbufetowicz,

@KWubbufetowicz ls | sed -n '1p;q'sembra più semplice
Fiximan,

3
La risposta che stavo cercando, ma non per la domanda di OP.
Michael Lang,

36

Stai cercando questo:

ls -C | awk '{ print $2 }'

Tuttavia, supponendo che proverai a utilizzare questo nome file in un secondo momento, non farlo, poiché si interromperà su nomi di file contenenti spazi bianchi. Invece, metti i file in un array e ottieni il secondo, che evita di dover eseguire alcun analisi:

files=(*)
printf '%s\n' "${files[1]}"

L'ordine in cui si ottengono i file dipende dal valore di LC_COLLATE. Pertanto, è consigliabile impostare LC_COLLATE=Cprima se si desidera un ordinamento "standard" in tutti i casi angolari.


Si noti che gli indici di array iniziano con 1in gusci sensibili (zsh, yash, fish, csh, tcsh, rc, es ...) e in 0in ksh e bash. Per una soluzione portatile per tutte le shell tipo Bourne, puoi usare: set -- *; printf '%s\n' "$2"invece.
Stéphane Chazelas,

@ StéphaneChazelas Almeno per questa domanda, i tag includono "bash", quindi questa risposta è specifica per quella shell.
Chris Down,

ls -C | awk '{print $ 1} sembra dare lo stesso risultato ... perché $ 2?
boctulus

7

Dovresti aggiungere -Ccome lsusa la modalità a colonna singola quando l'output non è un terminale. awkquindi stampa la seconda colonna:

ls -C | awk '{print $2}'

2

Penso che tu stia cercando

ls -1

Non mostrerà il permesso, il proprietario, il gruppo, la data, la dimensione ... ma il semplice nome del file in una singola colonna.


1
Non solo questa risposta è sbagliata, ma è già stata data in precedenza.
Scott,

Anche se mi rendo conto che questo è sbagliato per la domanda originale, è quello che stavo cercando. Quindi grazie.
AntumDeluge,

0

L'unico modo per me è aggiungere "-all". Questo è:

ls -C -all | awk '{ print $1 }'

Perché -allaggiungere più colonne come utente, autorizzazioni, ecc.


0

Come già accennato, l'utilizzo delle colonne per l'analisi lsdell'output non è molto efficace poiché lsinterrompe le linee in base alla lunghezza del nome del file e alla larghezza del terminale. Spesso è interessante visualizzare una singola colonna di un elenco di elementi. Puoi farlo usando il comando cut:

echo file1 file2 file3 file4 | cut -d" "  -f2

verrà visualizzato

file2

Si noti che -dconsente di selezionare il delimitatore di colonna, quindi ad esempio con

cur -d, -f2

puoi visualizzare la seconda colonna di un elenco separato da virgole.


0

Supponiamo che se si desidera visualizzare solo il nome file specifico nel percorso corrente, utilizzare il comando seguente

comando:

find path -maxdepth 1 -iname "filename"|sed "s/\.\///g"

0

Questo è difficile, perché l'analisi ls -Cdipende da:

  1. lunghezza del nome file, (che a sua volta dipende dall'elenco di file specificato passato a ls -C)
  2. larghezza terminale.
  3. il fatto che l' ls -Coutput sia colonnare, ma potrebbe essere configurato su un numero variabile di spazi come separatori di campo.
  4. la possibilità di spazi bianchi nei nomi dei file (la cui visualizzazione dipende dalle particolari lsopzioni di visualizzazione scelte).

Per ora, iniziamo con il problema più semplice, ( cioè non il n. 4 sopra), supponendo che non ci siano spazi bianchi nei nomi dei file . Per stampare la colonna n. 2, funziona:

COLUMNS=$COLUMNS ls -C | tr -s ' ' '\t' | cut -f2

Srotolare che:

  • COLUMNS=$COLUMNSgarantisce che la lunghezza della colonna alimentata | rimanga coerente con l'attuale display del terminale. Cambiare questo in un valore arbitrario funziona anche, quindi COLUMNS=50o COLUMNS=70 potrebbe causare ls -Cuna riorganizzazione delle cose in base a tali larghezze.

    Un altro metodo sarebbe quello di utilizzare l' -winterruttore, ad esempio :

    ls -w${COLUMNS} -C | tr -s ' ' '\t' | cut -f2
  • trrende coerenti i separatori di campo: una singola scheda tra ogni colonna.

  • cut genera la colonna desiderata.


Whitespace metodo in attesa ...
AGC

-1
num_chars=54 # offset
ls -ltr | cut -c$num_chars-

modificare il numero di caratteri (54) secondo necessità in modo da ottenere solo i dati desiderati.


2
per chiarire, usando 54-tell cut per ogni personaggio a partire dalla posizione 54; non si ferma alla colonna "riconosciuta dall'uomo"
Jeff Schaller

Non è una cattiva idea ... deve solo essere raffinato.
prusswan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.