Старые UNIX-заголовки (те, что были до эпохи GUI), использовались для того, чтобы использовать заглавные буквы в своих именах папок и делать простые имена файлов некапитализированными, чтобы получить этот результат автоматически.
JRobert
Полезный вопрос! Возможно, пришло время изменить принятый ответ на более простой и не нарушающий цвета терминала?
ippi
Попробуйls -lh --group-directories-first
Диого
Ответы:
28
Следующая команда выведет список каталогов первым, обычные файлы - вторым, а ссылки - третьим.
ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep "^l"
Кроме того, имеет смысл создать псевдоним для этой команды, чтобы сохранить нажатия клавиш.
Редактировать:
Если вы хотите сначала каталоги, а затем все, что не является каталогом, используйте это:
Эта команда не выводит список всех, если в папке есть, например, сокеты или FIFO
Studer
1
Эта отредактированная версия все еще должна работать с другими типами. Первый grep говорит все, что начинается с «d», а второй говорит все, что не начинается с «d». Конечно, все либо начинается с рекламы, либо нет, верно?
Ry4an Brase
1
@Mark - Почему просто не делать: ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep -v -E "^d|^-|^total"?
FCTW
1
Чтобы сделать команду @ FCTW псевдонимом OSX, добавьте это в ваш ~ / .profile:alias la="ls -la | grep \"^d\" && ls -la | grep \"^-\" && ls -la | grep -E \"^d|^-\" -v | grep -v \"^total\""
aliteralmind
2
Я нашел рабочее сокращенное обозначение: ls -la|grep ^d;ls -la|grep -v ^d(кавычки не обязательны и заменены &&на ;). Другим вариантом является введение переменной , а затем оценить его: a="ls -la|grep ^d";eval $a;eval $a -v. Может быть полезно избежать повторений, когда в ls/ указано гораздо больше параметров grep. Есть и такой ls -la --group-directories-firstвариант, однако самое короткое из нихls -la|sort
Стивен Прибилинский,
205
Я так люблю * nix и люблю видеть изобретательность, которая входит в некоторые из этих ответов ...
Мой не так хорош в GNU Linux:
alias ls='ls --color -h --group-directories-first'
Учитывая, что мне больше нравится работать с Linux-приложениями CLI, я также склонен обновлять coreutils в OSX:
brew install coreutils
alias ls='/usr/local/bin/gls --color -h --group-directories-first'
к сожалению, это не работает на терминале osx, так как опция - недоступна.
MEM
7
re love: это сарказм? Если так, я бы согласился.
allyourcode
4
Цель псевдонима ls - определить элементы конфигурации, которые я хочу использовать 90% времени. Меньше нажатий клавиш для достижения желаемого результата. Если вам когда-нибудь захочется иметь собственный вывод ls, вы всегда можете / bin / ls.
Джонатансерафини
4
@MEM Если вы используете OS X и вам нравится использовать Terminal, то вы должны brew install bash тогда, это будет работать! :)
Эндрю Ашбахер
5
Мое мнение: это должен был быть принятый ответ, поскольку в нем перечислены параметры командной строки для достижения именно цели, а не запутанного набора grep и т. Д.
Да, по умолчанию. Вы также можете использовать coreutils по умолчанию с PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH".
Бенеш
7
Есть некоторые вещи, которые я хочу видеть в списке каталогов, и пока ни один из ответов здесь не отвечает всем требованиям ниже. Мои требования к списку каталогов:
Каталоги и файлы отсортированы в алфавитном порядке
Каталоги перечислены первыми
Символьные ссылки (символические ссылки) сортируются как файлы
Сортировка нечувствительна к регистру
Сортировка игнорирует все начальные не-буквенные символы в имени файла
Список включает в себя общее количество каталогов (за исключением ./и ../), файлов и ссылок
Список включает в себя общий размер (использование диска) каталогов и файлов
Список должен выглядеть одинаково для Linux и Windows (оболочка Git Bash) - это было труднее всего получить, так как удобные опции, такие как --group-directories-firstне работать в Git Bash для Windows
После долгих взломов я наконец-то придумал однострочник (хотя и очень длинную линию ;-)), которым я доволен. Я назначил это псевдониму dir:
ls -dlF --color *.*| head -n2 && ls -AlF| LC_ALL=C grep "^d"|
LC_ALL=C sort -k 9df&& ls -AlF| LC_ALL=C grep "^[l-]"|
LC_ALL=C sort -k 9df&& echo -e `find -maxdepth 1 -type d ! -name . |
wc -l`Dir\(s\) `du -hs | cut -f 1`\\t\\t`find -maxdepth 1 -type f |
wc -l`File\(s\) `find -maxdepth 1 -type f -print0 | du -ch --files0-from=- |
tail -n 1 | cut -f 1`\\t\\t`find -maxdepth 1 -type l | wc -l`Link\(s\)
Чтобы упростить управление, я придумал отдельные команды для вывода каждого сегмента списка каталогов по своему вкусу, а затем собрал их вместе с помощью &&оператора.
ls -dlF --color * .* | head -n2- Извлечь ./и ../. Мы не хотим передавать их, sortпотому что они уже находятся в правильном порядке, и сортировка может привести к ../тому, что они будут перечислены первыми. -dВариант , чтобы избавиться от «полной» линии; Я хотел бы добавить, -Fчтобы показать косую черту для каталогов (он также помечает символические ссылки с "@", когда вы делаете простой ls -F).
ls -AlF | LC_ALL=C grep "^d" | LC_ALL=C sort -k 9df- Извлеките каталоги и отсортируйте их по имени файла (9-й столбец), игнорируя как символы без букв / пробелов ( dопция), так и регистр символов ( fопция). В ls -Aопции исключает ./и ../из списка , так как мы уже извлеченных их на предыдущем шаге. Я склонен ставить перед всеми grepи sortкомандами префикс LC_ALL=Cсброса локали, чтобы (1) вывод был согласованным для всех оболочек Unix, и (2) иногда вы могли видеть более высокую производительность, так как для него больше не было накладных расходов для тяжелого символа UTF-8, установленного на иметь дело с.
ls -AlF | LC_ALL=C grep "^[l-]" | LC_ALL=C sort -k 9df - Это похоже на шаг выше, но на этот раз мы сортируем файлы и символические ссылки.
find -maxdepth 1 -type d ! -name . | wc -l- Получить количество каталогов, исключая ./и ../.
find -maxdepth 1 -type f | wc -l - Получить количество файлов.
find -maxdepth 1 -type l | wc -l - Получить количество символических ссылок.
du -hs | cut -f 1 - Извлечение общего размера всех подкаталогов в удобочитаемом формате.
find -maxdepth 1 -type f -print0 | du -ch --files0-from=- | tail -n 1 | cut -f 1 - Извлечь общий размер всех файлов в удобочитаемом формате.
Давайте посмотрим наш новый dirпсевдоним в действии!
Один минус в том, что у вас не может быть цветных списков, так как символы управления цветом, окружающие имена файлов, делают сортировку слишком ненадежной.
ОБНОВИТЬ
Приведенный выше псевдоним был мучительно медленным при выполнении из корневого каталога глубокой файловой системы, поэтому я обновился до этой более простой, но гораздо более производительной команды:
ls -AFoqv--color --group-directories-first | tail -n +2&& find -maxdepth 1-type f -printf '%s\n'| awk '{total+=$1} END {print total" bytes"}'
Поскольку новая версия Git Bash для Windows поддерживает --group-directories-first, нам больше не нужно возвращаться sort. Несмотря на то, что новый псевдоним не отображает столько информации, сколько предыдущий псевдоним, выигрыш в производительности более чем оправдан. Как привилегия, вы также получаете цвета!
Отличный ответ! Но когда вы говорите: «После долгих взломов я наконец-то придумал однострочник…». Да, действительно, в классическом смысле это не «однострочник». Возможно, имеет смысл взять эту логику и сделать ее автономным сценарием оболочки и просто запустить ее или назвать ее псевдонимом.
JakeGould
@JakeGould Ты быстр! Я даже еще не закончил корректуру своего ответа, а вы уже закончили читать его и отстрелили комментарий :). Да, это главный кандидат на функцию, но в то время я был слишком ленив, поэтому просто бросил ее в мой файл .bash_aliases. С другой стороны, я обычно пишу функцию только тогда, когда я не могу что-то сделать без передачи параметров.
thdoan
@ 10basetom: Быстрый вопрос: Как получить разные цвета для столбцов в ls? Я могу раскрасить имена файлов по типу файла , используя ls --color, но я не вижу способа получить эти полезные цвета для столбцов. В чем секрет?
Это более хорошее решение IMO. Использование нескольких процессов и каналов для сортировки вместо конвейерной сортировки кажется отсталым. Тем более что ls- al|sort -k1 -rработает. Чего не хватало, так это только -rфлага.
Брайс
@brice Вещь , которая беспокоит меня о « своего рода» является то , что ./и ../не будет первые две строки, в этом порядке. Кроме того, я согласен, что это более эффективное решение.
thdoan
Как покрасить вывод?
Даниэль
5
К ответу delerious010 я бы добавил, что если вы хотите упорядочить в старом стиле:
LANG=C ls -la --group-directories-first
(или используйте LC_ALL или LANGUAGE или LC_COLLATE, установленный в «C»).
Это даст что-то похожее на:
...
DIRDir
dir.hidden123
UC_FILEUc_file
lc_file
Хотя, если я правильно помню, файлы со скрытыми точками изначально появлялись перед каталогами.
Вот функция, которая делает это (bash или zsh): И ... Я не предполагаю, что это лучший способ, но это тот, который я придумал и использую прямо сейчас:
функция LSS
{
# Показывает список каталогов с каталогами вверху.
команда ls --color = всегда $ @ | egrep '^ d | total'
команда ls --color = всегда $ @ | egrep -v '^ d | total';
}
Просто к вашему сведению это не работает. Вам необходимо использовать формат длинного списка ( ls -l), чтобы выполнить фильтрацию по типу файла. Также эта команда будет разбиваться на пробелы (в bash). Вы должны процитировать примерно так: "$@"если вы хотите использовать этот подход, вы можете сделать что-то вроде этого:function lss {local temp="$(command ls -l --color=always "$@")"; egrep --color=never '^d|total' <<<"$temp"; egrep --color=never -v '^d|total' <<<"$temp"}
Six
2
ls -laX сначала покажет вам каталоги в алфавитном порядке, но накрутит список файлов.
Длинные варианты:
ls-l # List--all-X # Sort alphabetically by entry extension
Ну, моя любимая ОС - Debian Linux. Ядро Debian gnu использует пакетную версию ls, которая поддерживает опцию --show-directoryies-first ... когда я начал использовать OSX, я просто взял все мои файлы bash dot из коробки Debian и сбросил их в свой домашний каталог ... I у меня было много bash_aliases, которые сломались так ... Именно тогда я должен был найти некоторые обходные пути для моих псевдонимов ...
Eddie B
Первый из них немного избыточен ... Нет смысла сортировать каталоги, так как это порядок, который мы должны изменять, а не каталоги ... 'ls -la | sort -r - это то, что действительно работает. В основном это заявляет ... 1) А) Найти. -d 1 -type d (Начать с этого каталога, выполнить поиск по одной глубине каталога и выполнить поиск только по каталогам) B) ls -la (перечислить файлы со всеми атрибутами) C) Сортировать их в обратном порядке 2) Выполнить как 1) просто отбросить поиск. ... это не нужно ... Мне больше нравится решение Studers ... :-)
Eddie B
1
TL; DR
alias ls='ls -lhF --color'
list_sorted(){
ls $*| grep "^d";
ls $*| grep "^-";
ls $*| grep -v -E "^d|^-|^total"}
alias ll=list_sorted
объяснение
Я использую комбинацию решений, представленных в ответах и комментариях здесь.
По умолчанию ls
Прежде всего, я перезаписываю поведение по умолчанию для ls:
-l: Всегда отображать список как одномерный вертикальный список
-h: Отображать размеры файлов удобочитаемым способом (например, 4,0 КБ вместо 4096)
-F: Отображать индикаторы как косую черту для каталогов
alias ls='ls -lhF --color'
расширенный ll
Далее я пишу функцию, содержащую логику сортировки. Для каждого lsя передаю ему любые первоначально переданные аргументы. Это позволяет мне использовать псевдоним из другого рабочего каталога, чем тот, который я хочу перечислить (то есть ls -a ~).
Кроме того, каждый вызов lsпередается в grepкоманду. Здесь происходит сортировка. ls -l | grep "^d"например, только списки каталогов. Если каталоги должны быть перечислены первыми, это также должно стоять на первом месте в функции. Следующая вещь - файлы.
Наконец, я показываю все, что не является ни каталогом, ни файлом (ни строку, показывающую общий размер содержимого каталога). Это делается путем поиска прямой директивы, обычных записей в файле и общей записи, а затем инвертирования результата через -vаргумент.
list_sorted(){# List directories
ls $*| grep "^d";# List regular files
ls $*| grep "^-";# List everything else (e.g. symbolic links)
ls $*| grep -v -E "^d|^-|^total"}
Наконец, я псевдоним функции для новой команды. В частности, я не хочу перезаписывать lsв случае нарушения моей функции в некоторых сценариях. Тогда я хочу иметь возможность использовать ls. Кроме того, вы всегда можете вызвать необъявленную lsкоманду, вызвав \ls.
alias ll=list_sorted
Примечания
Я использую ;вместо &&в качестве разделителя для команд. В противном случае невозможно отобразить содержимое каталогов, не содержащих каталогов (первая команда ls оценивается как false, что не позволяет выполнить следующую команду, поскольку она связана с &&. ;Избегает этого.)
Это решение сценария. Перечисляет только имена, без данных inode, в алфавитном порядке, без учета регистра, отформатированный в столбцы. Хотя это главная строка вместо основной колонки, как по умолчанию вывод ls. Столбцы становятся немного беспорядочными, если есть имя файла с> 26 символами.
rm -f /tmp/lsout
ls -1p| grep /| sort -f >>/tmp/lsout
ls -1p| grep -v /| sort -f >>/tmp/lsout
IFS=$'\n' read -d ''-r -a lines </tmp/lsout
printf "%-24s %-24s %-24s\n""${lines[@]}"
-
раньшеd
при использованииsort
ls -lh --group-directories-first
Ответы:
Следующая команда выведет список каталогов первым, обычные файлы - вторым, а ссылки - третьим.
ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep "^l"
Кроме того, имеет смысл создать псевдоним для этой команды, чтобы сохранить нажатия клавиш.
Редактировать:
Если вы хотите сначала каталоги, а затем все, что не является каталогом, используйте это:
ls -la | grep "^d" && ls -la | grep -v "^d"
источник
ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep -v -E "^d|^-|^total"
?alias la="ls -la | grep \"^d\" && ls -la | grep \"^-\" && ls -la | grep -E \"^d|^-\" -v | grep -v \"^total\""
ls -la|grep ^d;ls -la|grep -v ^d
(кавычки не обязательны и заменены&&
на;
). Другим вариантом является введение переменной , а затем оценить его:a="ls -la|grep ^d";eval $a;eval $a -v
. Может быть полезно избежать повторений, когда вls
/ указано гораздо больше параметровgrep
. Есть и такойls -la --group-directories-first
вариант, однако самое короткое из нихls -la|sort
Я так люблю * nix и люблю видеть изобретательность, которая входит в некоторые из этих ответов ...
Мой не так хорош в GNU Linux:
Учитывая, что мне больше нравится работать с Linux-приложениями CLI, я также склонен обновлять coreutils в OSX:
источник
brew install bash
тогда, это будет работать! :)Для пользователей Mac coreutils :
Предполагая, что ваша система готова к домашнему пиву :
источник
gls
скорее. Правильно?PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
.Есть некоторые вещи, которые я хочу видеть в списке каталогов, и пока ни один из ответов здесь не отвечает всем требованиям ниже. Мои требования к списку каталогов:
./
и../
), файлов и ссылок--group-directories-first
не работать в Git Bash для WindowsПосле долгих взломов я наконец-то придумал однострочник (хотя и очень длинную линию ;-)), которым я доволен. Я назначил это псевдониму dir:
Чтобы упростить управление, я придумал отдельные команды для вывода каждого сегмента списка каталогов по своему вкусу, а затем собрал их вместе с помощью
&&
оператора.ls -dlF --color * .* | head -n2
- Извлечь./
и../
. Мы не хотим передавать их,sort
потому что они уже находятся в правильном порядке, и сортировка может привести к../
тому, что они будут перечислены первыми.-d
Вариант , чтобы избавиться от «полной» линии; Я хотел бы добавить,-F
чтобы показать косую черту для каталогов (он также помечает символические ссылки с "@", когда вы делаете простойls -F
).ls -AlF | LC_ALL=C grep "^d" | LC_ALL=C sort -k 9df
- Извлеките каталоги и отсортируйте их по имени файла (9-й столбец), игнорируя как символы без букв / пробелов (d
опция), так и регистр символов (f
опция). Вls -A
опции исключает./
и../
из списка , так как мы уже извлеченных их на предыдущем шаге. Я склонен ставить перед всемиgrep
иsort
командами префиксLC_ALL=C
сброса локали, чтобы (1) вывод был согласованным для всех оболочек Unix, и (2) иногда вы могли видеть более высокую производительность, так как для него больше не было накладных расходов для тяжелого символа UTF-8, установленного на иметь дело с.ls -AlF | LC_ALL=C grep "^[l-]" | LC_ALL=C sort -k 9df
- Это похоже на шаг выше, но на этот раз мы сортируем файлы и символические ссылки.find -maxdepth 1 -type d ! -name . | wc -l
- Получить количество каталогов, исключая./
и../
.find -maxdepth 1 -type f | wc -l
- Получить количество файлов.find -maxdepth 1 -type l | wc -l
- Получить количество символических ссылок.du -hs | cut -f 1
- Извлечение общего размера всех подкаталогов в удобочитаемом формате.find -maxdepth 1 -type f -print0 | du -ch --files0-from=- | tail -n 1 | cut -f 1
- Извлечь общий размер всех файлов в удобочитаемом формате.Давайте посмотрим наш новый
dir
псевдоним в действии!ДО:
ПОСЛЕ:
Один минус в том, что у вас не может быть цветных списков, так как символы управления цветом, окружающие имена файлов, делают сортировку слишком ненадежной.
ОБНОВИТЬ
Приведенный выше псевдоним был мучительно медленным при выполнении из корневого каталога глубокой файловой системы, поэтому я обновился до этой более простой, но гораздо более производительной команды:
Образец вывода:
Поскольку новая версия Git Bash для Windows поддерживает
--group-directories-first
, нам больше не нужно возвращатьсяsort
. Несмотря на то, что новый псевдоним не отображает столько информации, сколько предыдущий псевдоним, выигрыш в производительности более чем оправдан. Как привилегия, вы также получаете цвета!источник
У вас есть несколько вариантов, в зависимости от того, хотите ли вы сохранить алфавитный порядок.
Вы можете просто попробовать:
или это, чтобы сохранить алфавитный порядок для файлов с такими же разрешениями:
или, как сказал одиннадцать81 (но эта версия перечисляет все):
источник
ls- al|sort -k1 -r
работает. Чего не хватало, так это только-r
флага../
и../
не будет первые две строки, в этом порядке. Кроме того, я согласен, что это более эффективное решение.К ответу delerious010 я бы добавил, что если вы хотите упорядочить в старом стиле:
(или используйте LC_ALL или LANGUAGE или LC_COLLATE, установленный в «C»).
Это даст что-то похожее на:
Хотя, если я правильно помню, файлы со скрытыми точками изначально появлялись перед каталогами.
источник
Вот функция, которая делает это (bash или zsh): И ... Я не предполагаю, что это лучший способ, но это тот, который я придумал и использую прямо сейчас:
источник
ls -l
), чтобы выполнить фильтрацию по типу файла. Также эта команда будет разбиваться на пробелы (в bash). Вы должны процитировать примерно так:"$@"
если вы хотите использовать этот подход, вы можете сделать что-то вроде этого:function lss {local temp="$(command ls -l --color=always "$@")"; egrep --color=never '^d|total' <<<"$temp"; egrep --color=never -v '^d|total' <<<"$temp"}
ls -laX
сначала покажет вам каталоги в алфавитном порядке, но накрутит список файлов.Длинные варианты:
источник
По-другому ...
ИЛИ ЖЕ
ИЛИ ЖЕ
источник
TL; DR
объяснение
Я использую комбинацию решений, представленных в ответах и комментариях здесь.
По умолчанию
ls
Прежде всего, я перезаписываю поведение по умолчанию для
ls
:-l
: Всегда отображать список как одномерный вертикальный список-h
: Отображать размеры файлов удобочитаемым способом (например, 4,0 КБ вместо 4096)-F
: Отображать индикаторы как косую черту для каталоговрасширенный
ll
Далее я пишу функцию, содержащую логику сортировки. Для каждого
ls
я передаю ему любые первоначально переданные аргументы. Это позволяет мне использовать псевдоним из другого рабочего каталога, чем тот, который я хочу перечислить (то естьls -a ~
).Кроме того, каждый вызов
ls
передается вgrep
команду. Здесь происходит сортировка.ls -l | grep "^d"
например, только списки каталогов. Если каталоги должны быть перечислены первыми, это также должно стоять на первом месте в функции. Следующая вещь - файлы.Наконец, я показываю все, что не является ни каталогом, ни файлом (ни строку, показывающую общий размер содержимого каталога). Это делается путем поиска прямой директивы, обычных записей в файле и общей записи, а затем инвертирования результата через
-v
аргумент.Наконец, я псевдоним функции для новой команды. В частности, я не хочу перезаписывать
ls
в случае нарушения моей функции в некоторых сценариях. Тогда я хочу иметь возможность использоватьls
. Кроме того, вы всегда можете вызвать необъявленнуюls
команду, вызвав\ls
.Примечания
;
вместо&&
в качестве разделителя для команд. В противном случае невозможно отобразить содержимое каталогов, не содержащих каталогов (первая команда ls оценивается как false, что не позволяет выполнить следующую команду, поскольку она связана с&&
.;
Избегает этого.)источник
Это решение сценария. Перечисляет только имена, без данных inode, в алфавитном порядке, без учета регистра, отформатированный в столбцы. Хотя это главная строка вместо основной колонки, как по умолчанию вывод ls. Столбцы становятся немного беспорядочными, если есть имя файла с> 26 символами.
И еще, с дополнительным форматированием.
Вывод для последнего выглядит следующим образом, за исключением цветов:
Просто помните, чтобы не использовать псевдоним или изменить поведение по умолчанию ls, так как этот скрипт вызывает его.
источник