Comment classer une liste d'éléments avec une largeur minimale?


7

Comment puis-je classer n'importe quelle entrée non-colonne comme le lsfait?

ls crée un tableau optimisé avec une largeur minimale pour chaque ligne, par exemple:

ls

2  dsao  file with space  with
5  e     g                wsdl-rubo-6cb0f1a9086e80c
d  file   leading space

mais si j'alimente la sortie column(par exemple, chaque fichier sur une ligne), il remplit chaque ligne de la même largeur, de sorte qu'il s'adapte à la largeur de l'écran:

for i in *; do echo "$i"; done | column

2                               file with space                          
5                               g                                        
d                                leading space                           
dsao                            with                                     
e                               wsdl-rubo-6cb0f1a9086e80c                
file

(J'utilise uniquement la liste de fichiers ici pour générer la même sortie que l'exemple, je cherche une telle solution pour classer d'autres choses à la fin.)

Comment est-ce que je peux colunnize n'importe quelle sortie avec une largeur de col variable?


D'accord, une autre lecture de votre demande, si je comprends bien vos commentaires, serait de "classer l'entrée comme le fait column -c_ n-x`, mais d'ajuster la sortie dans le moins de colonnes d'écran possible plutôt que de remplir la largeur spécifiée". Est-ce correct?
jthill

oui presque: en outre, il devrait y avoir autant de colonnes que possible qui tiennent dans l'écran. (comme le lsgère). Peut-être que nous trouvons la solution, si nous examinons le code source du code source de la lscommande dans coreutils
rubo77

Réponses:


5

Merci @ rubo77 d'avoir posé cette question, c'est un excellent exercice. Pour moi, c'était aux erreurs ponctuelles ce que l'anglais est Tough Stuff est au rythme bâclé: c'est devenu amusant, rapide, même si l'algorithme lui-même est assez simple.

[modification finale: déplacé vers https://github.com/jthill/columnate/blob/master/columnate , bug corrigé, ligne principale implémentée. ]


vous devriez également mettre cela sur github. S'il est plus rapide que le ls-algorythm, peut-être pouvez-vous créer un ls-util plus rapide?
rubo77

@ rubo77 Vous devez lui fournir la variable COLUMNS. voir le commentaire «test avec» dans le code. Et que 10x-20x est l'inverse, c'est plus lent, principalement parce que c'est
génial

time ls | sort | columnate COLUMNS=$COLUMNS
jthill

Tu es un génie. Cela doit être publié pour chaque distribution Linux
rubo77

eh, merci, vraiment, mais c'est trop fort. lire le code, c'est presque de la force brute
jthill

3

Quelque chose de proche de la sortie de ls:

for i in *; do echo -en "${i}\t"; done; echo

agréable, il ne fait que sauter en ligne, si les lignes d'entrée varient en largeur de plus d'un onglet. Existe-t-il un moyen d'empêcher une interruption de la sortie sur le côté droit de la fenêtre?
rubo77
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.