Quelle est la manière la plus simple de supprimer la ligne «total <size>» de la sortie de ls -l?

14

Le meilleur que j'ai pu trouver via Google / man lsétait:

ls -l | grep -v '^total'

Y a-t-il quelque chose qui me manque dans les drapeaux ls?

De plus, pourquoi la taille totale est-elle en Ko, quel que soit l'indicateur -h? gratter cela, semble que ce soit le cas, je ne sais pas ce que je voyais alors.

À M
la source
4
Peut-être un peu plus efficace pourrait être ls -l | tail -n+2, pour le reste je n'ai pas de réponse.
enzotib
J'aime davantage la méthode enzotib. Suggestion: configurez-le comme un alias et nommez-le lsl. Seulement 3 lettres;) oh et ls -lh me montrent des tailles de style 1,2K.
Rinzwind
Je pense que vous avez trouvé le moyen le plus simple.
Robert

Réponses:

11

En regardant dans le code source de coreutils, j'ai découvert qu'il totalsera toujours affiché lors de l'utilisation de l' -loption sur les répertoires .

L'utilisation de l' -doption pour répertorier les entrées au lieu du contenu du répertoire se masque total. Mais si vous exécutez cela sans arguments (ou sur un répertoire), cela affichera simplement le répertoire et non son contenu. Par conséquent, vous avez besoin de caractères génériques. *correspond à tous les fichiers et .*correspond également aux fichiers cachés (ce qui correspond à l' -aoption):

ls -ld * .*

Quant à l' -hoption, elle fonctionne pour moi. 1118360 octets apparaissent comme 1,1M. Les fichiers inférieurs à 1024 s'affichent en octets.

Lekensteyn
la source
1
en fait, -d répertorie les répertoires au lieu des entrées.
H2ONaCl
@broiyan Vous pouvez prendre la lspage de manuel à la lettre ou considérer ceci: ls /peut être interprété comme "lister l'entrée /s'il s'agit d'un fichier ou le contenu du répertoire /si c'est un répertoire". L'utilisation -dsupprime la dernière condition et imprime toujours l'entrée au lieu du contenu du répertoire. Cela s'applique peu importe si un chemin est un fichier ou un répertoire.
Lekensteyn
Je voterais à nouveau si je le pouvais
dps
7

L'utilisation de caractères génériques pour éviter d' lsexécuter la liste des répertoires n'est pas optimale, car elle vous empêche d'utiliser des lsoptions telles que --almost-all.

Comme la suggestion d'Enzotib , le moyen le plus simple de le supprimer est de le passer tailà travers pour couper la première ligne. Cependant, lsdétectera que sa sortie est un canal plutôt qu'interactif, et modifiera ses valeurs par défaut de manière indésirable. Par conséquent, pour le rendre robuste, vous devez également ajouter quelques options:

  • --color=always: continue à montrer les couleurs
  • --hide-control-chars: imprimer ?dans les noms de fichiers à la place des caractères de contrôle qui pourraient gâcher la sortie de la console

J'ai un script ~/bin/l(vous pouvez également utiliser un alias Bash ~/.bash_aliases):

#!/bin/bash
ls -l --color=always --hide-control-chars "$@" | tail --lines=+2

Vous pouvez également ajouter toutes les autres lsoptions que vous souhaitez par défaut, par exemple --group-directories-first --time-style='+%FT%T.%N%:::z' --indicator-style=slash.

Escargot mécanique
la source
Cependant, cela ne fonctionnera pas si vous passez plusieurs noms de fichiers à ls.
Sparhawk
3

ls -l *

Vous donnera le contenu du dossier "normalement nommé" sans le total. Cela pourrait convenir à vos besoins. Malheureusement, il ne vous donnera pas les dotfichiers préfixés. Si vous utilisez, ls -l * .*vous obtiendrez un gâchis puisque Linux naviguera dans l'arborescence.

Notez que le préfixe de point pourrait signifier le dossier ou avec un caractère générique, cela signifie le dossier ci-dessus, donc il ne vous aide pas à choisir des fichiers réguliers qui sont préfixés par un point. Cela semble avoir été une décision de conception malheureuse.

H2ONaCl
la source
1

$ ls -l [DIRECTORY] | sed 1d
(la sortie contient des noms de fichiers)

$ ls -ld [path-to-dir]/*
(la sortie contient des chemins relatifs mais conservera les couleurs)

$ ls -l [DIRECTORY] | tail -n +2

$ ls -l [DIRECTORY] | awk 'NR>=1'


Remarque: ce qui
suit ne fonctionne pas si vous avez un fichier nommé "total ...."

$ ls -l | grep -v '^total'

Robert Vila
la source