Какой самый простой способ удалить строку «total <size>» из вывода ls -l?

14

Лучшее, что я мог найти через Google /, man lsбыло:

ls -l | grep -v '^total'

Есть ли что-то, что мне не хватает в флагах ls?

Кроме того, почему общий размер в килобайтах, независимо от флага -h? поцарапайте это, кажется, что это делает, не уверен, что я видел тогда.

Том
источник
4
Может быть, немного более эффективным ls -l | tail -n+2, в остальном у меня нет ответа.
энзотиб
Мне больше нравится метод энзотиба. Предложение: установите его как псевдоним и назовите его lsl. Всего 3 буквы;) ох, а ls -lh показывает мне размеры в стиле 1.2K.
Rinzwind
Я думаю, что вы получили самый простой способ.
Роберт

Ответы:

11

Глядя в исходный код coreutils, я обнаружил, что totalвсегда будет отображаться при использовании -lопции на каталогах .

Использование -dопции для перечисления записей вместо содержимого каталога скрывает total. Но если вы запустите это без аргументов (или для каталога), он просто покажет каталог, а не его содержимое. Поэтому вам нужны подстановочные знаки. *сопоставляет все файлы и .*сопоставляет также скрытые файлы (что соответствует -aопции):

ls -ld * .*

Что касается -hварианта, он работает для меня. 1118360 байт отображаются как 1.1M. Файлы размером менее 1024 отображаются в байтах.

Lekensteyn
источник
1
фактически -d перечисляет каталоги вместо записей.
H2ONaCl
@broiyan Вы можете перенести lsстраницу руководства на букву или рассмотреть это: ls /можно интерпретировать как «перечислить запись, /если это файл, или содержимое каталога, /если это каталог». Использование -dудаляет последнее условие и всегда печатает запись вместо содержимого каталога. Это применимо независимо от того, является ли путь файлом или каталогом.
Лекенштейн
Я бы подтвердил это снова, если бы мог
дпс
7

Использование символов подстановки, чтобы избежать lsзапуска списка каталогов, является неоптимальным, потому что оно не позволяет использовать lsтакие параметры, как --almost-all.

Как и в случае с предложением Энзотиба , самый простой способ удалить его - пропустить через него, 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 будет перемещаться вверх по дереву.

Обратите внимание, что префикс точки может означать папку или подстановочный знак означает папку выше, поэтому он не поможет вам выбрать обычные файлы с префиксом точки. Похоже, это было неудачное дизайнерское решение.

H2ONaCl
источник
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'

Роберт Вила
источник