2009-05-20 10 views
9

In bash, come posso stampare i primi elementi n di un elenco?In bash, come posso stampare i primi n elementi di un elenco?

Ad esempio, i primi 10 file in questa lista:

FILES=$(ls) 

UPDATE: Ho dimenticato di dire che voglio stampare gli elementi su una linea, proprio come quando si stampa la lista completa con echo $FILES.

+0

Ho apportato una piccola correzione alla mia soluzione. Dovrebbe stampare tutti i nomi di file su una riga. Hai provato? –

+1

Leggete: http://mywiki.wooledge.org/ParsingLs - È importante comprendere le complessità e le insidie ​​di bash se volete evitare disastri sui vostri file. – lhunath

risposta

22
FILES=(*) 
echo "${FILES[@]:0:10}" 

Dovrebbe funzionare correttamente anche se ci sono spazi nei nomi dei file.

FILES=$(ls) crea una variabile di stringa. FILES=(*) crea una matrice. Vedi questa pagina per ulteriori examples on using arrays in bash. (Grazie lhunath)

+0

Che stampa i primi 10 caratteri, giusto? – Frank

+0

No, stampa i primi 10 elementi di un array. La matrice contiene nomi di file come elementi. –

+0

Il tuo riferimento all'ABS è negativo. Non usano le virgolette (tipico ABS), causando quindi errori di wordsplitting sul nome file espanso. L'ABS è pieno di tali bug nascosti che causano chiunque ne impari (tranne te, apparentemente, lo fai nel modo giusto) per ereditare questi bug! Mi riferisco invece a http://mywiki.wooledge.org/BashGuide/TheBasics/Arrays. – lhunath

0
FILES=$(ls) 
echo $FILES | fmt -1 | head -10 
+2

Non funziona come previsto se ci sono file con spazi nei loro nomi. –

+0

Ne sono consapevole, ma ho pensato che dehmann volesse usare questo metodo specifico, quindi ho calcolato che gli spazi non sarebbero stati un problema. BTW, volevi dire FILES = (*) echo "$ {FILES [@]: 0:10}" ? Funziona meglio qui. – sunny256

+1

In effetti, lo correggo. Grazie! –

2
echo $FILES | awk '{for (i = 1; i <= 10; i++) {print $i}}' 

Edit: Aah, perse il commento che avete bisogno di loro su una sola riga ...

echo $FILES | awk '{for (i = 1; i <= 10; i++) {printf "%s ", $i}}' 

Quello lo fa.

1

di farlo in modo interattivo:

set $FILES && eval eval echo \\\${1..10}

eseguirlo come uno script, creare foo.sh con contenuti

N=$1; shift; eval eval echo \\\${1..$N}

ed eseguirlo come

bash foo.sh 10 $FILES

5
FILE="$(ls | head -1)" 

Gestito correttamente anche gli spazi nei nomi dei file.

+0

Ciò può darti più directory. Forse vuoi dire '$ (ls -1 | head -1)'? – nh2

4

Perché non basta questo per stampare le prime 50 file:

ls -1 | head -50 
+0

OP voleva che fosse stampato su una riga. Vedi i commenti. – kubanczyk

2

mio modo potrebbe essere:

ls | head -10 | tr "\n" " " 

Ciò stamperà le prime 10 righe restituite da ls, e poi tr sostituisce tutti la linea si rompe con gli spazi. L'output sarà su una singola riga.

+0

Bella risposta. Forse dovrei anche aggiungere '-1' come' ls -1 | testa -10 | tr "\ n" "" '. In ogni caso questo è quello che stavo cercando;) – silgon

+0

Questa è la migliore risposta secondo me. Bello e semplice Elencali Seleziona il primo 10. Elimina le nuove linee per gli spazi. Fatto e fatto. Buona risposta. – user2233949

Problemi correlati