Я хотел бы использовать команду ls
чтобы сначала показать каталоги, а затем файлы. Я старался:
ls -la | sort -k 1
Но я получил неправильный заказ.
Я так люблю * 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'
Следующая команда выведет список каталогов первым, обычные файлы - вторым, а ссылки - третьим.
ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep "^l"
Кроме того, имеет смысл создать псевдоним для этой команды, чтобы сохранить нажатия клавиш.
Редактировать:
Если вы хотите сначала каталоги, а затем все, что не является каталогом, используйте это:
ls -la | grep "^d" && ls -la | grep -v "^d"
Для пользователей Mac coreutils:
brew install coreutils
alias ls='ls --color -h --group-directories-first'
Предполагая, что ваша система готова к домашнему пиву:
У вас есть несколько вариантов, в зависимости от того, хотите ли вы сохранить алфавитный порядок.
Вы можете просто попробовать:
ls -al | сортировать -k1 -r
или это, чтобы сохранить алфавитный порядок для файлов с такими же разрешениями:
ls -al | сортировать -k1,1 -k9,9 -r
или, как сказал одиннадцать81 (но эта версия перечисляет все):
ls -la | grep "^ d" && ls -la | grep "^ -" && ls -al | grep -v "^ [d | -]"
К ответу 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
Хотя, если я правильно помню, файлы скрытых точек изначально появлялись перед каталогами.
Есть определенные вещи, которые я хочу видеть в списке каталогов, и пока ни один из ответов здесь не отвечает всем требованиям ниже. Мои требования к списку каталогов:
./
и ../
), файлов и ссылок--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
. Несмотря на то, что новый псевдоним не отображает столько информации, сколько предыдущий псевдоним, выигрыш в производительности более чем оправдан. Как привилегия, вы также получаете цвета!
Вот функция для этого (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'; }
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, что не позволяет выполнить следующую команду, поскольку она в сочетании с &&
;
Избегает этого.)По-другому ...
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"
ls -laX
покажет вам каталоги сначала в алфавитном порядке, но запишет список файлов.
Длинные варианты:
ls
-l # List
--all
-X # Sort alphabetically by entry extension
Это решение сценария. Перечисляет только имена, без данных 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, так как этот скрипт вызывает его.