Я хотів би скористатися 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'
Зважаючи на те, що мені зручніше з моїми програмами CLI для Linux, я також оновлюю основні програми на OSX:
brew install coreutils
alias ls='/usr/local/bin/gls --color -h --group-directories-first'
brew install bash
, це спрацює! :)
Основні програми для користувачів Mac :
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 (але ця версія перераховує все):
лс -ла | 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 | всього' команда ls --color = завжди $ @ | egrep -v '^ d | всього'; }
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"
наприклад лише переліки каталогів. Якщо каталоги повинні бути перераховані першими, це також має стати першим у функції. Наступне - файли.
Нарешті, я показую все, що не є ні каталогом, ні файлом (ні рядком із загальним розміром вмісту каталогів). Це робиться через стиснення directoy, регулярні записи файлів та загальний запис, а потім інвертування результату через -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, таким чином не дозволяючи виконувати наступну команду, оскільки вона поєднана з &&
. ;
Уникає цього.)Це сценарійне рішення. Перелічує лише імена, без даних про введення, за алфавітом, без регістру та відформатованими у стовпці. Хоча це рядок-головний замість основного стовпця, як вихідний показник 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