2009-05-20 7 views
9

Dans bash, comment puis-je imprimer les premiers n éléments d'une liste?En bash, comment puis-je imprimer les n premiers éléments d'une liste?

Par exemple, les 10 premiers fichiers dans cette liste:

FILES=$(ls) 

MISE À JOUR: J'ai oublié de dire que je veux imprimer les éléments sur une ligne, tout comme lorsque vous imprimez la liste complète avec echo $FILES.

+0

J'ai fait une petite correction à ma solution. Il devrait imprimer tous les noms de fichiers sur une ligne. Est-ce que tu l'as essayé? –

+1

S'il vous plaît lire: http://mywiki.wooledge.org/ParsingLs - Il est important que vous compreniez les subtilités et les pièges de bash si vous voulez éviter les catastrophes sur vos fichiers. – lhunath

Répondre

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

Doit fonctionner correctement même s'il y a des espaces dans les noms de fichiers.

FILES=$(ls) crée une variable chaîne. FILES=(*) crée un tableau. Voir cette page pour plus d'infos examples on using arrays in bash. (Merci lhunath)

+0

Qui imprime les 10 premiers caractères, non? – Frank

+0

Non, il imprime les 10 premiers éléments d'un tableau. Le tableau contient des noms de fichiers en tant qu'éléments. –

+0

Votre référence à l'ABS est mauvaise. Ils n'utilisent pas de guillemets (ABS typique), causant ainsi des bogues de division de mots sur le nom de fichier étendu. ABS est plein de tels bugs cachés causant quiconque qui apprend de lui (sauf pour vous, apparemment, vous le faites bien) d'hériter de ces bugs! Je me référerais à http://mywiki.wooledge.org/BashGuide/TheBasics/Arrays à la place. – lhunath

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

Ne fonctionne pas comme prévu s'il existe des fichiers avec des espaces dans leurs noms. –

+0

Je suis conscient de cela, mais je pensais que dehmann voulait utiliser cette méthode spécifique, donc je pensais que les espaces ne seraient pas un problème. BTW, avez-vous dire FILES = (*) echo "$ {FILES [@]: 00:10}" ? Cela fonctionne mieux ici. – sunny256

+1

En effet, je corrige ceci. Merci! –

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

Edit: AAh, a raté votre commentaire que vous avez besoin d'eux sur une ligne ...

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

Que l'on fait ça.

1

pour le faire de manière interactive:

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

pour l'exécuter comme un script, créez foo.sh avec le contenu

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

et l'exécuter comme

bash foo.sh 10 $FILES

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

Les espaces gérés dans les noms de fichiers correctement aussi quand je l'ai essayé.

+0

Cela peut vous donner plusieurs répertoires. Peut-être que vous voulez dire '$ (ls -1 | head -1)'? – nh2

4

Pourquoi ne pas simplement cette option pour imprimer les 50 premiers fichiers:

ls -1 | head -50 
+0

OP voulait imprimer sur une ligne. Voir les commentaires. – kubanczyk

2

Mon chemin serait:

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

Cela affichera les 10 premières lignes retournées par ls, puis tr remplace tous sauts de ligne avec des espaces. La sortie sera sur une seule ligne.

+0

Bonne réponse. Je devrais peut-être ajouter "-1" comme 'ls -1 | tête -10 | tr "\ n" "" '. En tout cas c'est ce que je cherchais;) – silgon

+0

C'est la meilleure réponse à mon avis. Nice et simple. Listez-les. Sélectionnez le premier 10. Supprimez les nouvelles lignes pour les espaces. Fait et fait. Bonne réponse. – user2233949

Questions connexes