Какой самый простой способ удалить строку “итого” из вывода ls -l?

Вопрос или проблема

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

ls -l | grep -v '^total'

Неужели я что-то упустил в флагах для ls?

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

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

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

ls -ld * .*

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

Использование подстановочных знаков, чтобы избежать выполнения 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 -l *

Это даст вам содержимое “обычно названного” каталога без total. Это может подойти вам. К сожалению, это не даст вам файлов с точкой перед именем. Если вы используете ls -l * .*, вы получите беспорядок, поскольку Linux будет перемещаться вверх по дереву.

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

$ 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'

Чтобы ответить на ваш точный вопрос, следует использовать ls -1A ., который отображает файлы, каталоги и скрытые файлы/каталоги, не использует пайпы или внешние инструменты (grep/tr/cut..), и не полагается на включение или отключение каких-либо параметров сгруппировки оболочки, таких как extglob, globstar или nullglob. Я протестировал это, чтобы подтвердить это утверждение.

-1    перечислить один файл на строку. Избежать '\n' с -q или -b
-A,   --almost-all           не перечислять подразумеваемые . и ..

Пример вывода:

user@host:/dir$ ls -1A .
temp
terraform
.test
tor
torrent-stuff
.Trash-1000
virtual_appliance
visualblind
vpn-ipv4.txt
vpn-ipv6.txt
zztestfile
.zztestfile2

Также, вот что я сохраняю в своем .bash_aliases, касающемся перечисления каталогов/файлов:

# ls каталоги
alias listdirs="ls -d */ | cut -f1 -d"/""
alias listdirs2='ls -ld */'
alias listdirs3='ls -p . | grep -E "/$" | tr -d "/"'
alias listdirs4='ls -lA | grep -E "^d"'
# ls файлы
alias listfiles="ls -pA | grep -vE "/$""
alias listfiles2='ls -lA | grep -vE "^d"'
alias listfiles3='ls -p | grep -vE "/$"'
# ls нормально
alias lsnormal="ls -lAh1d *"
alias lsnormal2='ls -1 .'

ls, похоже, не принимает параметр R, когда указан -1.
Он также не принимает аргумент позиции (если вы находитесь в каталоге /home, команда не вернет содержимое корня /)

sudo ls -l1diR *
     13 lrwxrwxrwx   1 root root     7 Հլս  8 23:58 bin -> usr/bin
 131073 drwxr-xr-x   4 root root  4096 Հլս  9 00:30 boot
2228225 drwxrwxr-x   2 root root  4096 Հլս  9 00:00 cdrom
      1 drwxr-xr-x  21 root root  4300 Հլս 12 08:46 dev
1572865 drwxr-xr-x 140 root root 12288 Հլս 12 09:06 etc
1179649 drwxr-xr-x   3 root root  4096 Հլս  9 00:01 home
     14 lrwxrwxrwx   1 root root     7 Հլս  8 23:58 lib -> usr/lib
     15 lrwxrwxrwx   1 root root     9 Հլս  8 23:58 lib32 -> usr/lib32
     16 lrwxrwxrwx   1 root root     9 Հլս  8 23:58 lib64 -> usr/lib64
     17 lrwxrwxrwx   1 root root    10 Հլս  8 23:58 libx32 -> usr/libx32
     11 drwx------   2 root root 16384 Հլս  8 23:58 lost+found
 524289 drwxr-xr-x   3 root root  4096 Հլս  9 00:11 media
 262145 drwxr-xr-x   2 root root  4096 Ապր 15 03:27 mnt
2097153 drwxr-xr-x   4 root root  4096 Հլս 10 01:39 opt
      1 dr-xr-xr-x 325 root root     0 Հլս 12 08:46 proc
1310721 drwx------   4 root root  4096 Հլս  9 10:36 root
      1 drwxr-xr-x  35 root root   940 Հլս 12 09:07 run
     18 lrwxrwxrwx   1 root root     8 Հլս  8 23:58 sbin -> usr/sbin
 393217 drwxr-xr-x  11 root root  4096 Հլս 10 01:25 snap
1835009 drwxr-xr-x   2 root root  4096 Ապր 15 03:27 srv
      1 dr-xr-xr-x  13 root root     0 Հլս 12 08:46 sys
1966081 drwxrwxrwt  19 root root  4096 Հլս 12 09:09 tmp
1310722 drwxr-xr-x  14 root root  4096 Ապր 15 03:27 usr
 655361 drwxr-xr-x  14 root root  4096 Ապր 15 03:32 var

Ответ или решение

Как легко убрать строку "total " из вывода команды ls -l?

Команда ls -l в Unix-подобных системах используется для отображения подробной информации о файлах и директориях. Одним из ее особенностей является то, что при вызове с параметрами она выводит строку вида "total ", где <size> обозначает общий размер файлов и директорий в текущем каталоге. Возможность отключить эту строку полезна, если вам нужно просто увидеть содержимое каталога без лишних данных.

Способы удаления строки "total "

  1. Использование команды grep:

    Самый распространенный метод, предложенный многими пользователями, – это использование команды grep:

    ls -l | grep -v '^total'

    Этот метод работает, поскольку grep отфильтровывает строку, начинающуюся со слова "total". Однако нужно учитывать, что если в каталоге окажется файл с именем "total", он также будет удален из вывода.

  2. Команда tail:

    Также весьма распространено использование tail, чтобы отрезать первую строку из вывода ls:

    ls -l | tail -n +2

    Также можно воспользоваться другими инструментами, такими как sed:

    ls -l | sed 1d

    Эти команды собираются уберечь вывод от строки "total" без риска удаления файлов с таким именем. Однако они могут изменить поведение ls в случае, если вывод идет в конвейере (pipe вместо интерактивного режима).

  3. Использование опций ls:

    Команда ls имеет определенные варианты, которые позволяют обойти необходимость использовать конвейеры. Например, можно использовать следующий вариант:

    ls -d --color=always --hide-control-chars *

    Это позволит вам отобразить содержимое каталога без лишней информации о количестве файлов. Однако, учтите, что этот подход не покажет скрытые файлы (файлы, начинающиеся с точки).

  4. Создание пользовательского скрипта:

    Для более гибкой настройки предложите создать простой Bash-скрипт. Например:

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

    Сохраните этот скрипт как ~/bin/l, и вы можете использовать его везде, передавая любые параметры ls при необходимости.

  5. Использование параметров -1A:

    Если ваша основная цель – просмотреть файлы и директории в текущем каталоге, не вдаваясь в детали, можно использовать:

    ls -1A .

    Этот метод отобразит файлы по одному на строку и включает в вывод скрытые файлы, но исключит строку "total".

Заключение

Удаление строки "total " из вывода команды ls -l не требует использования сложных инструментов или команд. Существуют простые и эффективные методы для достижения этой цели, такие как использование grep, tail или создание пользовательского скрипта, а также использование определенных параметров команды ls. Выбор подходящего метода может зависеть от ваших предпочтений и требований к выводу.

Оцените материал
Добавить комментарий

Капча загружается...