79

Я хотел бы использовать команду ls чтобы сначала показать каталоги, а затем файлы. Я старался:

ls -la | sort -k 1

Но я получил неправильный заказ.

11 ответов11

187

Я так люблю * nix и люблю видеть изобретательность, которая входит в некоторые из этих ответов ...

Мой не так хорош в GNU Linux:

alias ls='ls --color -h --group-directories-first'

Учитывая то, что мне удобнее работать с приложениями CLI для Linux, я также склонен обновлять coreutils в OSX:

brew install coreutils
alias ls='/usr/local/bin/gls --color -h --group-directories-first'
25

Следующая команда выведет список каталогов первым, обычные файлы - вторым, а ссылки - третьим.

ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep "^l"

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

Редактировать:

Если вы хотите сначала каталоги, а затем все, что не является каталогом, используйте это:

ls -la | grep "^d" && ls -la | grep -v "^d"

16

Для пользователей Mac coreutils:

brew install coreutils

alias ls='ls --color -h --group-directories-first'

Предполагая, что ваша система готова к домашнему пиву:

6

У вас есть несколько вариантов, в зависимости от того, хотите ли вы сохранить алфавитный порядок.

Вы можете просто попробовать:

ls -al | сортировать -k1 -r

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

ls -al | сортировать -k1,1 -k9,9 -r

или, как сказал одиннадцать81 (но эта версия перечисляет все):

ls -la | grep "^ d" && ls -la | grep "^ -" && ls -al | grep -v "^ [d | -]"

5

К ответу delerious010 я бы добавил, что если вы хотите упорядочить по старому стилю:

LANG=C ls -la --group-directories-first

(или используйте LC_ALL или LANGUAGE или LC_COLLATE, установленный в "C").

Это даст что-то похожее на:

.
..
DIR
Dir
dir
.hidden
123
UC_FILE
Uc_file
lc_file

Хотя, если я правильно помню, файлы скрытых точек изначально появлялись перед каталогами.

4

Есть определенные вещи, которые я хочу видеть в списке каталогов, и пока ни один из ответов здесь не отвечает всем требованиям ниже. Мои требования к списку каталогов:

  1. Каталоги и файлы отсортированы по алфавиту
  2. Каталоги перечислены первыми
  3. Символьные ссылки (символические ссылки) сортируются как файлы
  4. Сортировка чувствительна к регистру
  5. Сортировка игнорирует все начальные не-буквенные символы в имени файла
  6. Список включает в себя общее количество каталогов (за исключением ./ и ../), файлов и ссылок
  7. Список включает в себя общий размер (использование диска) каталогов и файлов
  8. Список должен выглядеть одинаково для 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 - избавиться от строки total; Я хотел бы добавить -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 -alF
total 22
drwxr-xr-x   13 Tom      Administ     4096 Oct 25 02:38 ./
drwxr-xr-x    3 Tom      Administ        0 Dec 24  2014 ../
drwxr-xr-x   15 Tom      Administ     4096 Sep 17 01:23 .VirtualBox/
-rw-r--r--    1 Tom      Administ      615 Oct 25 02:38 .aliases
-rw-r--r--    1 Tom      Administ    12742 Oct 24 11:47 .bash_history
-rw-r--r--    1 Tom      Administ     3234 Oct 24 15:06 .bash_profile
drwxr-xr-x    1 Tom      Administ        0 Jan 24  2015 .gem/
-rw-r--r--    1 Tom      Administ      586 Oct 24 03:53 .gitconfig
drwxr-xr-x    1 Tom      Administ     4096 Dec 28  2014 .ssh/
drwxr-xr-x    4 Tom      Administ        0 Jan 24  2015 .travis/
-rw-r--r--    1 Tom      Administ     6645 Oct 25 02:38 _viminfo
-rw-r--r--    1 Tom      Administ     4907 Oct 24 15:16 profile
drwxr-xr-x    1 Tom      Administ        0 Oct 24 22:20 tmp/

ПОСЛЕ:

$ dir
drwxr-xr-x   13 Tom      Administ     4096 Oct 25 02:38 ./
drwxr-xr-x    3 Tom      Administ        0 Dec 24  2014 ../
drwxr-xr-x    1 Tom      Administ        0 Jan 24  2015 .gem/
drwxr-xr-x    1 Tom      Administ     4096 Dec 28  2014 .ssh/
drwxr-xr-x    1 Tom      Administ        0 Oct 24 22:20 tmp/
drwxr-xr-x    4 Tom      Administ        0 Jan 24  2015 .travis/
drwxr-xr-x   15 Tom      Administ     4096 Sep 17 01:23 .VirtualBox/
-rw-r--r--    1 Tom      Administ      615 Oct 25 02:38 .aliases
-rw-r--r--    1 Tom      Administ    12742 Oct 24 11:47 .bash_history
-rw-r--r--    1 Tom      Administ     3234 Oct 24 15:06 .bash_profile
-rw-r--r--    1 Tom      Administ      586 Oct 24 03:53 .gitconfig
-rw-r--r--    1 Tom      Administ     4907 Oct 24 15:16 profile
-rw-r--r--    1 Tom      Administ     6645 Oct 25 02:38 _viminfo
      5 Dir(s) 2.8M           6 File(s) 31K           0 Link(s)

Единственный минус в том, что у вас не может быть цветных списков, так как символы управления цветом, окружающие имена файлов, делают сортировку слишком ненадежной.


ОБНОВИТЬ

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

ls -AFoqv --color --group-directories-first | tail -n +2 && find -maxdepth 1 -type f -printf '%s\n' | awk '{total+=$1} END {print total" bytes"}'

Образец вывода:

$ dir
drwxr-xr-x 1 Tom     0 Mar 29 13:49 .aws/
drwxr-xr-x 1 Tom     0 Mar 29 13:49 .gem/
drwxr-xr-x 1 Tom     0 Mar 29 19:32 .ssh/
drwxr-xr-x 1 Tom     0 Mar 29 13:49 .zbstudio/
drwxr-xr-x 1 Tom     0 Jun 16  2016 temp/
drwxr-xr-x 1 Tom     0 Jul 13  2016 vimfiles/
-rw-r--r-- 2 Tom   365 Mar 30 10:37 .aliases
-rw-r--r-- 1 Tom 16028 Mar 30 12:12 .bash_history
-rw-r--r-- 2 Tom  2807 Mar 30 12:12 .bash_profile
-rw-r--r-- 2 Tom  2177 Mar 29 23:24 .functions
-rw-r--r-- 1 Tom  1091 Mar 30 10:34 .gitconfig
-rw-r--r-- 1 Tom  8907 Mar 29 14:45 _viminfo
-rw-r--r-- 1 Tom  2444 Jul 13  2016 _vimrc
33819 bytes

Поскольку новая версия Git Bash для Windows поддерживает --group-directories-first , нам больше не нужно возвращаться к sort . Несмотря на то, что новый псевдоним не отображает столько информации, сколько предыдущий псевдоним, выигрыш в производительности более чем оправдан. Как привилегия, вы также получаете цвета!

2

Вот функция для этого (bash или zsh): И ... Я не утверждаю, что это лучший способ, но тот, который я придумал и сейчас использую:

function lss
{
    # Shows directory listing with directories at the top.

    command ls  --color=always $@ | egrep '^d|total'
    command ls  --color=always $@ | egrep -v '^d|total';
}
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.0K вместо 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, что не позволяет выполнить следующую команду, поскольку она в сочетании с && ; Избегает этого.)
1

По-другому ...

find . -d 1 -type d | ls -la | sort -r 

ИЛИ ЖЕ

ls -la | sort -r

ИЛИ ЖЕ

d=`find . -type d -d 1`;f=`find . -type f -d 1`; echo -e -DIRS- "\n$d\n" -FILES- "\n$f"
1

ls -laX покажет вам каталоги сначала в алфавитном порядке, но запишет список файлов.

Длинные варианты:

ls
    -l    # List
    --all
    -X    # Sort alphabetically by entry extension
0

Это решение сценария. Перечисляет только имена, без данных 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[@]}"

И еще, с дополнительным форматированием.

rm -f /tmp/lsout
echo "  ---- Directories ---- " >> /tmp/lsout
ls -1p | grep / | sort -f >> /tmp/lsout
IFS=$'\n' read -d '' -r -a lines < /tmp/lsout
printf "%-24s  %-24s  %-24s\n" "${lines[@]}"

rm -f /tmp/lsout
echo "  ------- Files ------- " >> /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[@]}"

Вывод для последнего выглядит следующим образом, за исключением цветов:

  ---- Directories ----   archive/                  bookmarks/              
Desktop/                  Documents/                Downloads/              
fff/                      health/                   Library/                
Movies/                   Music/                    Pictures/               
Public/                   rrf/                      scifi/            
testdir/                  testdir2/                                         
  ------- Files -------   @todo                     comedy            
delme                     lll                       maxims                  
schedule                  vtokens style

Просто помните, чтобы не использовать псевдоним или изменить поведение по умолчанию ls, так как этот скрипт вызывает его.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .