Ich möchte den ls
Befehl verwenden, um zuerst Verzeichnisse und dann Dateien anzuzeigen. Ich habe es versucht:
ls -la | sort -k 1
Aber ich habe eine falsche Bestellung bekommen.
ls -lh --group-directories-first
Ich möchte den ls
Befehl verwenden, um zuerst Verzeichnisse und dann Dateien anzuzeigen. Ich habe es versucht:
ls -la | sort -k 1
Aber ich habe eine falsche Bestellung bekommen.
ls -lh --group-directories-first
Antworten:
Der folgende Befehl listet zuerst die Verzeichnisse, dann die normalen Dateien und an dritter Stelle die Verknüpfungen auf.
ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep "^l"
Es wäre auch sehr sinnvoll, einen Alias für diesen Befehl zu erstellen , um Tastenanschläge zu speichern.
Bearbeiten:
Wenn Sie zuerst Verzeichnisse und dann alles, was kein zweites Verzeichnis ist, möchten, verwenden Sie Folgendes:
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
(Zitate sind nicht erforderlich , und ersetzt &&
mit ;
). Eine weitere Option ist eine Variable einzuführen und dann auswerten: a="ls -la|grep ^d";eval $a;eval $a -v
. Kann hilfreich sein, um Wiederholungen zu vermeiden, wenn für ls
/ viel mehr Optionen angegeben sind grep
. Es gibt auch diese ls -la --group-directories-first
Option, aber die kürzeste imo istls -la|sort
Ich liebe * nix und liebe es, den Einfallsreichtum zu sehen, der in einigen dieser Antworten steckt ...
Meins ist unter GNU Linux nicht annähernd so ausgefallen:
alias ls='ls --color -h --group-directories-first'
Da ich mit meinen Linux-CLI-Apps besser zurechtkomme, aktualisiere ich Coreutils auch unter OSX:
brew install coreutils
alias ls='/usr/local/bin/gls --color -h --group-directories-first'
brew install bash
Dann funktioniert das! :)
Für Mac-Benutzer coreutils :
brew install coreutils
alias ls='ls --color -h --group-directories-first'
Angenommen, Ihr System ist bereit für das Homebrew :
gls
lieber. Richtig?
PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
.
Es gibt bestimmte Dinge, die ich in einer Verzeichnisliste sehen möchte, und bisher erfüllt keine der Antworten hier alle unten aufgeführten Anforderungen. Meine Anforderungen an eine Verzeichnisliste:
./
und ../
), Dateien und Links--group-directories-first
in Git Bash für Windows nicht funktionierenNach langem Hin und Her habe ich endlich einen Einzeiler (wenn auch eine sehr lange Schlange ;-)) gefunden, mit dem ich zufrieden bin. Ich habe dies einem Alias namens "dir" zugewiesen:
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\)
Um die Verwaltung zu vereinfachen, habe ich separate Befehle erstellt, um jedes Segment der Verzeichnisliste nach meinen Wünschen auszugeben, und diese dann mithilfe des &&
Operators zusammengesetzt.
ls -dlF --color * .* | head -n2
- Auszug ./
und ../
. Wir möchten diese nicht weiterleiten, sort
da sie bereits in der richtigen Reihenfolge vorliegen. Wenn Sie sie sortieren, werden sie ../
möglicherweise zuerst aufgelistet. Die -d
Option ist, die "Gesamt" -Zeile loszuwerden; Ich mag hinzufügen -F
, um den abschließenden Schrägstrich für Verzeichnisse zu zeigen (es wird auch Symlinks mit "@" markieren, wenn Sie eine Ebene tun ls -F
).
ls -AlF | LC_ALL=C grep "^d" | LC_ALL=C sort -k 9df
- Extrahieren Sie die Verzeichnisse und sortieren Sie sie nach Dateiname (9. Spalte), wobei sowohl Nicht-Alpha / Leerzeichen ( d
Option) als auch Groß- / Kleinschreibung ( f
Option) ignoriert werden . Die ls -A
Option schließt ./
und ../
aus der Auflistung aus, da wir sie bereits im vorherigen Schritt extrahiert haben. Ich neige dazu , alle Präfix grep
und sort
Befehle mit dem LC_ALL=C
Gebietsschema zurückgesetzt , so dass (1) die Ausgabe über Unix - Shells konsistent ist, und (2) Sie können manchmal eine schnellere Leistung sehen , da es nicht mehr den Aufwand der schweren UTF-8 - Zeichen muss gesetzt Zurecht kommen.
ls -AlF | LC_ALL=C grep "^[l-]" | LC_ALL=C sort -k 9df
- Dies ist ähnlich wie oben, aber diesmal sortieren wir Dateien und Symlinks.
find -maxdepth 1 -type d ! -name . | wc -l
- Ermitteln Sie die Anzahl der Verzeichnisse ohne ./
und ../
.
find -maxdepth 1 -type f | wc -l
- Holen Sie sich die Anzahl der Dateien.
find -maxdepth 1 -type l | wc -l
- Ermitteln Sie die Anzahl der Symlinks.
du -hs | cut -f 1
- Extrahieren Sie die Gesamtgröße aller Unterverzeichnisse in einem für Menschen lesbaren Format.
find -maxdepth 1 -type f -print0 | du -ch --files0-from=- | tail -n 1 | cut -f 1
- Extrahieren Sie die Gesamtgröße aller Dateien in einem für Menschen lesbaren Format.
Lassen Sie uns unseren neuen dir
Alias in Aktion sehen!
VOR:
$ 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/
NACH:
$ 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)
Ein kleiner Nachteil ist, dass Sie keine farbigen Listen haben können, da die Farbkontrollzeichen, die die Dateinamen umgeben, die Sortierung zu unzuverlässig machen.
AKTUALISIEREN
Der obige Alias war schmerzhaft langsam, als er aus dem Stammverzeichnis eines tiefen Dateisystems ausgeführt wurde. Daher habe ich auf diesen einfacheren, aber viel leistungsstärkeren Befehl aktualisiert:
ls -AFoqv --color --group-directories-first | tail -n +2 && find -maxdepth 1 -type f -printf '%s\n' | awk '{total+=$1} END {print total" bytes"}'
Beispielausgabe:
$ 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
Seit die neue Version von Git Bash für Windows unterstützt wird --group-directories-first
, müssen wir nicht mehr darauf zurückgreifen sort
. Auch wenn der neue Alias nicht so viele Informationen anzeigt wie der vorherige, sind die Leistungssteigerungen mehr als wert. Als Vorteil erhalten Sie auch Farben!
Sie haben verschiedene Möglichkeiten, je nachdem, ob Sie die alphabetische Reihenfolge beibehalten möchten.
Sie könnten einfach versuchen:
ls -al | sort -k1 -r
oder dies, um die alphabetische Reihenfolge für Dateien mit denselben Berechtigungen beizubehalten:
ls -al | sort -k1,1 -k9,9 -r
oder, wie eleven81 sagte (aber diese Version listet alles auf):
ls -la | grep "^ d" && ls -la | grep "^ -" && ls -al | grep -v ^ [d | -]
ls- al|sort -k1 -r
funktioniert. Was fehlte, ist nur die -r
Flagge.
./
und ../
wird die ersten beiden Zeilen nicht sein, in dieser Reihenfolge. Ansonsten stimme ich zu, dass es die effizientere Lösung ist.
Zur Antwort von delerious010 würde ich Folgendes hinzufügen, wenn Sie eine Bestellung im alten Stil wünschen:
LANG=C ls -la --group-directories-first
(oder verwenden Sie LC_ALL oder LANGUAGE oder LC_COLLATE auf "C").
Dies ergibt etwas Ähnliches wie:
.
..
DIR
Dir
dir
.hidden
123
UC_FILE
Uc_file
lc_file
Obwohl, wenn ich mich richtig erinnere, die versteckten Punktdateien ursprünglich vor den Verzeichnissen erschienen sind.
Hier ist eine Funktion, um dies zu tun (bash oder zsh).
funktion lss { # Zeigt die Verzeichnisliste mit den Verzeichnissen oben an. Befehl ls --color = immer $ @ | egrep '^ d | total' Befehl ls --color = immer $ @ | egrep -v '^ d | total'; }
ls -l
) verwenden, um nach einem solchen Dateityp zu filtern. Dieser Befehl bricht auch bei Leerzeichen (in Bash) ab. Sie müssen wie folgt zitieren: "$@"
Wenn Sie diesen Ansatz verwenden möchten, können Sie Folgendes tun:function lss {local temp="$(command ls -l --color=always "$@")"; egrep --color=never '^d|total' <<<"$temp"; egrep --color=never -v '^d|total' <<<"$temp"}
ls -laX
zeigt Ihnen zuerst die Verzeichnisse in alphabetischer Reihenfolge an, schraubt aber die Dateiliste.
Lange Optionen:
ls
-l # List
--all
-X # Sort alphabetically by entry extension
Ein anderer Weg ...
find . -d 1 -type d | ls -la | sort -r
ODER
ls -la | sort -r
ODER
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
Ich verwende eine Kombination der Lösungen, die in den Antworten und Kommentaren hier angegeben sind.
ls
Zunächst überschreibe ich das Standardverhalten für ls
:
-l
: Die Liste immer als eindimensionale vertikale Liste anzeigen-h
: Anzeigen von Dateigrößen in lesbarer Form (z. B. 4,0 KB anstelle von 4096 KB)-F
: Zeigen Sie Indikatoren wie einen abschließenden Schrägstrich für Verzeichnisse analias ls='ls -lhF --color'
ll
Als nächstes schreibe ich eine Funktion, die die Sortierlogik enthält. Für jeden ls
gebe ich irgendwelche ursprünglich übergebenen Argumente an ihn weiter. Dadurch kann ich den Alias aus einem anderen Arbeitsverzeichnis als dem, das ich auflisten möchte, verwenden ls -a ~
.
Außerdem wird jeder Aufruf ls
an einen grep
Befehl weitergeleitet. Hier erfolgt die Sortierung. ls -l | grep "^d"
Zum Beispiel werden nur Verzeichnisse aufgelistet. Wenn Verzeichnisse zuerst aufgelistet werden sollen, muss dies auch in der Funktion an erster Stelle stehen. Das nächste ist Dateien.
Zuletzt zeige ich alles, was weder ein Verzeichnis noch eine Datei ist (noch die Zeile, die die Gesamtgröße des Verzeichnisinhalts anzeigt). Dies geschieht durch Greifen von directoy, regulären Dateieinträgen und dem Gesamteintrag und anschließendes Invertieren des Ergebnisses über das -v
Argument.
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"
}
Schließlich habe ich die Funktion einem neuen Befehl zugeordnet. Insbesondere möchte ich nicht überschreiben, ls
falls meine Funktion in einigen Szenarien unterbrochen wird. Dann möchte ich nutzen können ls
. Alternativ können Sie den ls
Befehl ohne Alias immer durch Aufrufen aufrufen \ls
.
alias ll=list_sorted
;
statt &&
als Begrenzer für die Befehle. Andernfalls kann man den Inhalt von Verzeichnissen, die keine Verzeichnisse enthalten, nicht auflisten (der erste ls-Befehl wird mit false ausgewertet, sodass der nächste Befehl nicht ausgeführt werden kann, da er mit gekoppelt ist &&
. ;
Dies wird vermieden.)Dies ist eine Skriptlösung. Listet nur die Namen auf, keine Inode-Daten, alphabetisch, ohne Berücksichtigung der Groß- und Kleinschreibung, in Spalten formatiert. Obwohl es sich wie die Standardausgabe von ls um Zeilenmajor anstelle von Spaltenmajor handelt. Die Spalten werden etwas unordentlich, wenn ein Dateiname mit> 26 Zeichen vorhanden ist.
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[@]}"
Und eine andere, mit etwas zusätzlicher Formatierung.
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[@]}"
Die Ausgabe für den letzten sieht wie folgt aus, abzüglich der Farben:
---- 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
Denken Sie nur daran, kein Alias zu verwenden oder das Standardverhalten von ls zu ändern, da dieses Skript es aufruft.
-
kommt vord
bei der Verwendungsort