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