Який найпростіший спосіб видалити рядок "total <size>" з виводу ls -l?


14

Найкраще, що я міг знайти через Google / man ls:

ls -l | grep -v '^total'

Щось мені не вистачає у прапорах ls?

Крім того, чому загальний розмір в kb, незалежно від прапора -h? подряпини, що, здається, це робить, не впевнений, що я бачив тоді.


4
Можливо, трохи ефективніше могло б бути ls -l | tail -n+2, на інше я не маю відповіді.
enzotib

Мені більше подобається метод ензотибу. Пропозиція: встановіть його як псевдонім і назвіть його lsl. Всього 3 літери;) ой і ls -lh показує мені стилі розмірів 1,2K.
Rinzwind

Я думаю, що ти найпростіше дістався.
Роберт

Відповіді:


11

Заглянувши у вихідний код coreutils, я виявив, що totalзавжди буде відображатися при використанні -lпараметра в каталогах .

Використовуючи -dопцію для списку записів замість вмісту каталогу, ховається total. Але якщо запустити це без аргументів (або в каталозі), він просто покаже каталог, а не його вміст. Тому вам потрібні підстановки. *відповідає всім файлам і .*збігається з прихованими файлами (що відповідає -aопції):

ls -ld * .*

Щодо -hваріанту, він працює для мене. 1118360 байт відображається як 1,1 мільйона. Файли менше 1024 відображаються в байтах.


1
насправді -d перераховує каталоги замість записів.
H2ONaCl

@broiyan Ви можете перенести сторінку lsкерівництва до листа або розглянути це: ls /його можна інтерпретувати як "список запису, /якщо це файл або вміст каталогу, /якщо це каталог". Використання -dвидаляє останню умову і завжди буде друкувати запис замість вмісту каталогу. Це застосовується незалежно від того, чи шлях є файлом чи каталогом.
Лекенштейн

Я б схвалив це ще раз, якщо зможу
dps

7

Використовувати підстановку, щоб уникнути lsзапуску списку каталогів, це неоптимально, оскільки це заважає використовувати lsтакі параметри --almost-all.

Як і пропозиція Enzotib , найпростіший спосіб її видалити - це передати його, tailщоб відрізати перший рядок. Однак lsвиявить, що його вихід - це труба, а не інтерактивна, і змінить свої за замовчуванням небажаним способом. Отже, щоб зробити його надійним, слід також додати деякі варіанти:

  • --color=always: продовжуйте показувати кольори
  • --hide-control-chars: друкуйте ?імена файлів замість контрольних символів, які можуть зіпсувати вихід консолі

У мене є сценарій ~/bin/l(ви також можете використовувати псевдонім Bash у ~/.bash_aliases):

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

Ви також можете додати будь-які інші lsваріанти , які ви хочете за замовчуванням, наприклад --group-directories-first --time-style='+%FT%T.%N%:::z' --indicator-style=slash.


Однак це не спрацює, якщо ви передасте кілька імен файлів ls.
Sparhawk

3

ls -l *

Дасть вам "нормально названий" вміст папки без total. Це може відповідати вашим потребам. На жаль, він не надасть вам dotпрефіксованих файлів. Якщо ви користуєтеся, ls -l * .*ви отримаєте безлад, оскільки Linux буде орієнтуватися на дерево.

Зверніть увагу, що префікс крапки може означати папку або з підстановкою, це означає вищезгадану папку, тому це не допоможе вам обирати звичайні файли, які мають префікс. Це, здається, було невдалим дизайнерським рішенням.


1

$ ls -l [DIRECTORY] | sed 1d
(вихід містить імена файлів)

$ ls -ld [path-to-dir]/*
(вихід містить відносні шляхи, але збереже кольори)

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

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


Примітка:
Далі не працює, якщо у вас є файл з назвою "total ...."

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.