Chciałbym użyć ls
polecenia, aby najpierw wyświetlić katalogi, a następnie pliki. Próbowałem:
ls -la | sort -k 1
Ale mam złe zamówienie.
ls -lh --group-directories-first
Chciałbym użyć ls
polecenia, aby najpierw wyświetlić katalogi, a następnie pliki. Próbowałem:
ls -la | sort -k 1
Ale mam złe zamówienie.
ls -lh --group-directories-first
Odpowiedzi:
Następujące polecenie wyświetli katalogi jako pierwsze, zwykłe pliki jako drugie, a łącza trzecie.
ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep "^l"
Ponadto sensowne byłoby utworzenie aliasu dla tego polecenia, aby zapisać naciśnięcia klawiszy.
Edytować:
Jeśli chcesz najpierw katalogów, a następnie wszystkiego, co nie jest drugim katalogiem, użyj tego:
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
(cytaty nie są wymagane i zastępowane &&
przez ;
). Inną opcją jest wprowadzenie zmiennej, a następnie oceniają go: a="ls -la|grep ^d";eval $a;eval $a -v
. Może być użyteczny, aby uniknąć powtórzeń, gdy dla ls
/ podano więcej opcji grep
. Jest też taka ls -la --group-directories-first
opcja, jednak najkrótsze imo tols -la|sort
Uwielbiam * nix i uwielbiam pomysłowość, która dotyczy niektórych z tych odpowiedzi ...
Mój nie jest tak fantazyjny w GNU Linux:
alias ls='ls --color -h --group-directories-first'
Biorąc pod uwagę, że czuję się bardziej komfortowo z aplikacjami CLI dla Linuksa, zwykle aktualizuję coreutils w OSX:
brew install coreutils
alias ls='/usr/local/bin/gls --color -h --group-directories-first'
brew install bash
wtedy, to zadziała! :)
Dla użytkowników komputerów Mac coreutils :
brew install coreutils
alias ls='ls --color -h --group-directories-first'
Zakładając, że twój system jest gotowy do homebrew :
gls
raczej. Dobrze?
PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
.
Są pewne rzeczy, które chcę zobaczyć na liście katalogów, a jak dotąd żadna z odpowiedzi tutaj nie spełnia wszystkich poniższych wymagań. Moje wymagania dotyczące katalogu:
./
i ../
), plików i łączy--group-directories-first
nie działają w Git Bash dla WindowsPo wielu włamaniach, w końcu wymyśliłem linijkę (choć bardzo długą linię ;-)), z której jestem zadowolony. Przypisałem to aliasowi o nazwie „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\)
Aby ułatwić zarządzanie, wymyśliłem osobne polecenia, które wypisują każdy segment listy katalogów według moich upodobań, a następnie złożyłem je razem za pomocą &&
operatora.
ls -dlF --color * .* | head -n2
- Ekstrakt ./
i ../
. Nie chcemy ich przekazywać, sort
ponieważ są one już we właściwej kolejności, a ich sortowanie może spowodować, ../
że zostaną wymienione jako pierwsze. -d
Opcją jest, aby pozbyć się linii „całkowitą”; Lubię dodawać, -F
aby wyświetlać ukośnik końcowy dla katalogów (będzie również oznaczać dowiązania symboliczne „@”, gdy robisz zwykły ls -F
).
ls -AlF | LC_ALL=C grep "^d" | LC_ALL=C sort -k 9df
- Wyodrębnij katalogi i posortuj je według nazwy pliku (9 kolumna), ignorując zarówno znaki inne niż alfabetyczne / spacje ( d
opcja), jak i wielkość liter ( f
opcja). W ls -A
wyklucza opcji ./
i ../
od notowań skoro już ekstrakcji je w poprzednim kroku. Mam tendencję do prefiksu wszystkich grep
i sort
poleceń z LC_ALL=C
resetowaniem ustawień regionalnych, aby (1) dane wyjściowe były spójne w powłokach uniksowych i (2) czasami można zobaczyć większą wydajność, ponieważ nie ma już narzutu ciężkiego zestawu znaków UTF-8 na radzić sobie z.
ls -AlF | LC_ALL=C grep "^[l-]" | LC_ALL=C sort -k 9df
- Jest to podobne do powyższego kroku, ale tym razem sortujemy pliki i dowiązania symboliczne.
find -maxdepth 1 -type d ! -name . | wc -l
- Uzyskaj liczbę katalogów, z wyłączeniem ./
i ../
.
find -maxdepth 1 -type f | wc -l
- Uzyskaj liczbę plików.
find -maxdepth 1 -type l | wc -l
- Uzyskaj liczbę dowiązań symbolicznych.
du -hs | cut -f 1
- Wyodrębnij całkowity rozmiar wszystkich podkatalogów w formacie czytelnym dla człowieka.
find -maxdepth 1 -type f -print0 | du -ch --files0-from=- | tail -n 1 | cut -f 1
- Wyodrębnij całkowity rozmiar wszystkich plików w formacie czytelnym dla człowieka.
Zobaczmy nasz nowy dir
alias w akcji!
PRZED:
$ 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/
PO:
$ 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)
Jednym drobnym minusem jest to, że nie można mieć kolorowych list, ponieważ znaki sterujące kolorem otaczające nazwy plików powodują, że sortowanie jest zbyt niewiarygodne.
AKTUALIZACJA
Powyższy alias był boleśnie powolny po uruchomieniu z katalogu głównego głębokiego systemu plików, więc zaktualizowałem to prostsze, ale o wiele bardziej wydajne polecenie:
ls -AFoqv --color --group-directories-first | tail -n +2 && find -maxdepth 1 -type f -printf '%s\n' | awk '{total+=$1} END {print total" bytes"}'
Przykładowe dane wyjściowe:
$ 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
Ponieważ nowa wersja Git Bash obsługuje system Windows --group-directories-first
, nie musimy już na niej polegać sort
. Mimo że nowy alias nie wyświetla tyle informacji, co poprzedni alias, wzrost wydajności jest więcej niż wart. Jako profit otrzymasz także kolory!
Masz kilka możliwości, w zależności od tego, czy chcesz zachować porządek alfabetyczny.
Możesz po prostu spróbować:
ls -al | sortuj -k1 -r
lub to, aby zachować porządek alfabetyczny dla plików z tymi samymi uprawnieniami:
ls -al | sortuj -k1,1 -k9,9 -r
lub, jak powiedział jedenaście81 (ale ta wersja zawiera wszystko):
ls -la | grep "^ d" && ls -la | grep "^ -" && ls -al | grep -v "^ [d | -]"
ls- al|sort -k1 -r
działa. Brakowało tylko -r
flagi.
./
i ../
nie będzie pierwszym dwie linie, w tej kolejności. Poza tym zgadzam się, że jest to bardziej wydajne rozwiązanie.
Do odpowiedzi delerious010 dodam, że jeśli chcesz zamówić w starym stylu:
LANG=C ls -la --group-directories-first
(lub użyj LC_ALL lub LANGUAGE lub LC_COLLATE ustawionych na „C”).
To da coś podobnego do:
.
..
DIR
Dir
dir
.hidden
123
UC_FILE
Uc_file
lc_file
Chociaż, o ile dobrze pamiętam, ukryte pliki kropek pierwotnie pojawiły się przed katalogami.
Oto funkcja pozwalająca to zrobić (bash lub zsh): I ... Nie sugeruję, że to najlepszy sposób, ale to ten, który wymyśliłem i używam teraz:
funkcja lss { # Pokazuje listę katalogów z katalogami u góry. polecenie ls --color = zawsze $ @ | egrep „^ d | total” polecenie ls --color = zawsze $ @ | egrep -v '^ d | total'; }
ls -l
), aby filtrować według typu pliku tego typu. Również to polecenie będzie działać na spacjach (w bash). Musisz cytować w ten sposób: "$@"
Jeśli chcesz zastosować to podejście, możesz zrobić coś takiego:function lss {local temp="$(command ls -l --color=always "$@")"; egrep --color=never '^d|total' <<<"$temp"; egrep --color=never -v '^d|total' <<<"$temp"}
ls -laX
pokaże najpierw katalogi w kolejności alfabetycznej, ale przekręci listę plików.
Długie opcje:
ls
-l # List
--all
-X # Sort alphabetically by entry extension
Inny sposób ...
find . -d 1 -type d | ls -la | sort -r
LUB
ls -la | sort -r
LUB
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
Korzystam z kombinacji rozwiązań zawartych w odpowiedziach i komentarzach tutaj.
ls
Przede wszystkim nadpisuję domyślne zachowanie dla ls
:
-l
: Zawsze wyświetlaj listę jako jednowymiarową, pionową listę-h
: Wyświetlaj rozmiary plików w sposób czytelny dla człowieka (np. 4,0 KB zamiast 4096)-F
: Wyświetlanie wskaźników takich jak ukośnik końcowy dla katalogówalias ls='ls -lhF --color'
ll
Następnie piszę funkcję zawierającą logikę sortowania. Do każdego ls
przekazuję wszelkie pierwotnie przekazane mu argumenty. To pozwala mi używać aliasu z innego katalogu roboczego niż ten, który chcę wyświetlić (tj ls -a ~
.).
Ponadto każde wywołanie do ls
jest przesyłane potokowo do grep
polecenia. Tutaj odbywa się sortowanie. ls -l | grep "^d"
na przykład wyświetla tylko katalogi. Jeśli katalogi powinny być wymienione jako pierwsze, musi to również zająć pierwsze miejsce w funkcji. Następną rzeczą są pliki.
Na koniec pokazuję wszystko, co nie jest ani katalogiem, ani plikiem (ani wierszem pokazującym całkowity rozmiar zawartości katalogu). Odbywa się to poprzez grepowanie directoy, zwykłych wpisów w plikach i całkowitego wpisu, a następnie odwrócenie wyniku za pomocą -v
argumentu.
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"
}
Wreszcie alias funkcji do nowego polecenia. W szczególności nie chcę nadpisywać ls
na wypadek, gdyby moja funkcja uległa awarii w niektórych scenariuszach. Potem chcę móc korzystać ls
. Alternatywnie możesz zawsze wywołać niezaaloryzowane ls
polecenie, wywołując \ls
.
alias ll=list_sorted
;
zamiast &&
jako separatora poleceń. W przeciwnym razie nie będzie można wyświetlić zawartości katalogów niezawierających katalogów (pierwsza komenda ls ma wartość false, co uniemożliwia wykonanie następnej komendy, ponieważ jest ona połączona z &&
. ;
Unika tego.)To jest rozwiązanie skryptowe. Wyświetla tylko nazwy, brak danych i-węzłów, alfabetycznie, bez rozróżniania wielkości liter, sformatowane w kolumny. Chociaż jest to wiersz-major zamiast kolumny major, jak domyślne wyjście ls. Kolumny stają się nieco nieporządne, jeśli nazwa pliku ma> 26 znaków.
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[@]}"
I jeszcze jedno, z dodatkowym formatowaniem.
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[@]}"
Wyjście dla ostatniego wygląda następująco, bez kolorów:
---- 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
Pamiętaj tylko, aby nie aliasować ani nie zmieniać domyślnego zachowania ls, ponieważ ten skrypt go wywołuje.
-
pojawia się przedd
użyciemsort