Вопрос или проблема
Лучшее, что я нашел через 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
в Unix-подобных системах используется для отображения подробной информации о файлах и директориях. Одним из ее особенностей является то, что при вызове с параметрами она выводит строку вида "total <size>
обозначает общий размер файлов и директорий в текущем каталоге. Возможность отключить эту строку полезна, если вам нужно просто увидеть содержимое каталога без лишних данных.
Способы удаления строки "total "
-
Использование команды
grep
:Самый распространенный метод, предложенный многими пользователями, – это использование команды
grep
:ls -l | grep -v '^total'
Этот метод работает, поскольку
grep
отфильтровывает строку, начинающуюся со слова "total". Однако нужно учитывать, что если в каталоге окажется файл с именем "total", он также будет удален из вывода. -
Команда
tail
:Также весьма распространено использование
tail
, чтобы отрезать первую строку из выводаls
:ls -l | tail -n +2
Также можно воспользоваться другими инструментами, такими как
sed
:ls -l | sed 1d
Эти команды собираются уберечь вывод от строки "total" без риска удаления файлов с таким именем. Однако они могут изменить поведение
ls
в случае, если вывод идет в конвейере (pipe вместо интерактивного режима). -
Использование опций
ls
:Команда
ls
имеет определенные варианты, которые позволяют обойти необходимость использовать конвейеры. Например, можно использовать следующий вариант:ls -d --color=always --hide-control-chars *
Это позволит вам отобразить содержимое каталога без лишней информации о количестве файлов. Однако, учтите, что этот подход не покажет скрытые файлы (файлы, начинающиеся с точки).
-
Создание пользовательского скрипта:
Для более гибкой настройки предложите создать простой Bash-скрипт. Например:
#!/bin/bash ls -l --color=always --hide-control-chars "$@" | tail --lines=+2
Сохраните этот скрипт как
~/bin/l
, и вы можете использовать его везде, передавая любые параметрыls
при необходимости. -
Использование параметров
-1A
:Если ваша основная цель – просмотреть файлы и директории в текущем каталоге, не вдаваясь в детали, можно использовать:
ls -1A .
Этот метод отобразит файлы по одному на строку и включает в вывод скрытые файлы, но исключит строку "total".
Заключение
Удаление строки "total ls -l
не требует использования сложных инструментов или команд. Существуют простые и эффективные методы для достижения этой цели, такие как использование grep
, tail
или создание пользовательского скрипта, а также использование определенных параметров команды ls
. Выбор подходящего метода может зависеть от ваших предпочтений и требований к выводу.