Die ls
command ist einer der ersten Befehle, die wir lernen, wenn wir die Shell entdecken. Und danach wird es, unabhängig von Ihrem Können, eines der am häufigsten verwendeten bleiben.
Trotz dieser Popularität gehen wir selten über das -l
hinaus , -d
und -a
Optionen. Schade, da ein typisches ls
Implementierung hat Dutzende von Optionen zur Verfügung! Ich schlage Ihnen daher vor, mir bei meiner Suche nach dem ls
zu folgen Befehl versteckte Edelsteine.
Beispieldateihierarchie, die wir in diesem ls-Befehlsleitfaden verwenden
Bevor wir zum Kern der Sache kommen, brauchen wir ein wenig Vorbereitung:Es wäre schwierig, die ls
zu studieren Befehl ohne ein Verzeichnis, an dem gearbeitet werden kann. Damit Sie die in diesem Artikel angegebenen Befehle auf Ihrem Computer ausprobieren können, erfahren Sie hier, wie Sie die Beispieldateihierarchie erstellen, die ich in allen meinen Beispielen verwenden werde. Kopieren Sie einfach diese Befehlsliste und fügen Sie sie in Ihr Terminal ein, und schon sind Sie bereit:
mkdir ls
cd ls
# Create a hidden file:
echo You can not see me > .hidden
# Create a couple of 2MiB files:
dd if=/dev/zero of=a bs=1M count=2
dd if=/dev/zero of=b bs=1M seek=1 count=1
# Create few sub-directories
mkdir -p dir/subdir dir/subdir2
# Create a bunch of empty files
touch c dir/{d,e,f} dir/subdir/{g,h,i} dir/subdir2/{j,k,l}
# Create few links (hard and symbolic)
ln dir/e hardlink-to-file
ln -s dir/f symlink-to-file
ln -s dir/subdir symlink-to-subdir
Wenn Sie Probleme mit diesen Befehlen haben, zögern Sie nicht, den Kommentarbereich zu verwenden, um um Hilfe zu bitten. Angenommen, jetzt ist alles in Ordnung, ist es an der Zeit, in unser Hauptthema einzutauchen.
Die bekannten Anwendungsfälle des ls-Befehls
Da jede Reise mit einem ersten Schritt beginnt, lassen Sie uns zuerst die sehr grundlegenden Anwendungsfälle für ls
betrachten Befehl. Wenn Sie sich als Experte betrachten, können Sie natürlich sofort zu den Abschnitten für Fortgeschrittene springen. Aber wenn du jetzt lieber bei mir bleibst, toll:Vielleicht lernst du ein oder zwei Dinge!
<no option>
:das Standardverhalten
Die ls
Der Befehl gibt Informationen über alle dateiähnlichen Objekte, auf die durch die in der Befehlszeile angegebenen Pfade verwiesen wird. Bei Verwendung ohne Option:
- die einzige angezeigte Information ist der Name des dateiähnlichen Objekts, auf das der Pfad zeigt;
- wenn dieser Pfad auf ein Verzeichnis (oder einen symbolischen Link zu einem Verzeichnis) zeigt, wird der
ls
Der Befehl listet auch den Inhalt dieses Verzeichnisses auf; - werden mehrere Einträge angezeigt, werden sie alphabetisch nach ihrem Dateinamen sortiert.
Wenn schließlich kein Pfad in der Befehlszeile angegeben wird, wird die ls
Befehle nimmt ./
an –das ist das aktuelle Verzeichnis.
Sehen wir uns jetzt all diese Regeln in Aktion an:
# display the content of the current directory
sh:~/ls$ ls ./
a c e hardlink-to-file symlink-to-file
b dir f link-to-subdir symlink-to-subdir
# without any option, `ls` is equivalent
# to `ls ./`
sh:~/ls$ ls
a c e hardlink-to-file symlink-to-file
b dir f link-to-subdir symlink-to-subdir
# entries are sorted alphabetically
# ("dir/f" starts with a "d" so it is before "e")
sh:~/ls$ ls c b e dir/f a
a b c dir/f e
# when a command line argument is a directory
# (or a symbolic link to a directory)
# displays its content
sh:~/ls$ ls a b c link-to-subdir dir
a b c
dir:
d e f subdir subdir2
link-to-subdir:
g h i
-d
:Verzeichnisinhalt nicht auflisten
Mit dem -d
Option ls
zeigt nicht mehr den Inhalt des auf der Kommandozeile angegebenen Verzeichnisses an, sondern behandelt Verzeichniseinträge genauso wie Dateieinträge. Vergleichen wir:
# Default behavior: display the content of the `dir` directory
sh:~/ls$ ls a dir b
a b
dir:
d e f subdir subdir2
# `-d` option: directories are handled like files
sh:~/ls$ ls -d a dir b
a b dir
Bei Verwendung des -d
Option allein, gibt es keinen großen Unterschied zwischen ls
und ein einfaches echo
Befehl:
# In both case, the `*` glob pattern is expanded by
# the shell, which also takes care of
# sorting entries in the alphabetical order
sh:~/ls$ ls -d *
a b c dir hardlink-to-file symlink-to-file symlink-to-subdir
sh:~/ls$ echo *
a b c dir hardlink-to-file symlink-to-file symlink-to-subdir
Aber das -d
Die Option wird nützlicher, wenn sie mit einer anderen Option verknüpft ist, um zusätzliche Informationen anzuzeigen, z. B. bei Verwendung von -l
Flagge werden wir jetzt sehen.
-l
:die Langformatoption
Im ls
Beliebtheitswettbewerb für Optionen, der -l
(Kleinbuchstabe) Option wäre wahrscheinlich der Gewinner. Es ist so nützlich, dass viele Systeme einen ll
anbieten Alias für ls -l
(oder ls -l<something>
)
Das -l
steht für das lange Format. Mit dieser Option wird die ls
Der Befehl zeigt jeden Eintrag in einer eigenen Zeile mit den folgenden Informationen an:* Dateimodus * Anzahl der Links * Eigentümername * Gruppenname * Anzahl der Bytes in der Datei * Datum und Uhrzeit * Pfadname
Auch mit dem -l
Option ls
folgen keinen symbolischen Links mehr. Daher werden die Informationen (Dateimodus, Anzahl der Links usw.) über den Link selbst und nicht über sein Ziel angezeigt. Aus dem gleichen Grund ist der ls
Der Befehl zeigt nicht den Inhalt von Verzeichnissen an, auf die symbolische Links verweisen:
# Default behavior: displays only the filename and
# follows symbolic links:
sh:~/ls$ ls *
a b c e f hardlink-to-file symlink-to-file
dir:
d e f subdir subdir2
link-to-subdir:
g h i
symlink-to-subdir:
g h i
# `-l` option: displays extended informations and
# no longer follows symbolic links
sh:~/ls$ ls -l *
-rw-r--r-- 1 sylvain sylvain 2097152 Sep 19 22:18 a
-rw-r--r-- 1 sylvain sylvain 2097152 Sep 19 22:18 b
-rw-r--r-- 1 sylvain sylvain 0 Sep 19 22:18 c
-rw-r--r-- 3 sylvain sylvain 0 Sep 19 22:18 e
lrwxrwxrwx 1 sylvain sylvain 5 Sep 19 12:09 f -> dir/f
-rw-r--r-- 3 sylvain sylvain 0 Sep 19 22:18 hardlink-to-file
lrwxrwxrwx 1 sylvain sylvain 10 Sep 19 12:09 link-to-subdir -> dir/subdir
lrwxrwxrwx 1 sylvain sylvain 5 Sep 19 22:18 symlink-to-file -> dir/f
lrwxrwxrwx 1 sylvain sylvain 10 Sep 19 22:18 symlink-to-subdir -> dir/subdir
dir:
total 8
-rw-r--r-- 1 sylvain sylvain 0 Sep 19 22:18 d
-rw-r--r-- 3 sylvain sylvain 0 Sep 19 22:18 e
-rw-r--r-- 1 sylvain sylvain 0 Sep 19 22:18 f
drwxr-xr-x 2 sylvain sylvain 4096 Sep 19 12:09 subdir
drwxr-xr-x 2 sylvain sylvain 4096 Sep 19 12:09 subdir2
Zum Abschluss dieses Abschnitts lasse ich Sie die Ausgabe untersuchen, die wir durch Kombinieren der beiden -l
erhalten und -d
Optionen:
sh:~/ls$ ls -ld *
-rw-r--r-- 1 sylvain sylvain 2097152 Sep 19 22:18 a
-rw-r--r-- 1 sylvain sylvain 2097152 Sep 19 22:18 b
-rw-r--r-- 1 sylvain sylvain 0 Sep 19 22:18 c
drwxr-xr-x 4 sylvain sylvain 4096 Sep 19 12:09 dir
-rw-r--r-- 3 sylvain sylvain 0 Sep 19 22:18 e
lrwxrwxrwx 1 sylvain sylvain 5 Sep 19 12:09 f -> dir/f
-rw-r--r-- 3 sylvain sylvain 0 Sep 19 22:18 hardlink-to-file
lrwxrwxrwx 1 sylvain sylvain 10 Sep 19 12:09 link-to-subdir -> dir/subdir
lrwxrwxrwx 1 sylvain sylvain 5 Sep 19 22:18 symlink-to-file -> dir/f
lrwxrwxrwx 1 sylvain sylvain 10 Sep 19 22:18 symlink-to-subdir -> dir/subdir
-a
:Alle Dateien anzeigen
Mit dem -a
Option ls
schließt versteckte Dateien ein, wenn der Inhalt eines Verzeichnisses angezeigt wird. Aber was ist eine versteckte Datei?
Per Konvention wird auf Unix-ähnlichen Systemen eine Datei, deren Name mit einem Punkt beginnt, als versteckt betrachtet. Zusätzlich enthält jedes Verzeichnis noch zwei spezielle, normalerweise versteckte Einträge:.
und ..
In jedem Verzeichnis:
- der
.
Einstiegspunkte zum Verzeichnis selbst. Diese Art von Selbstreferenz mag merkwürdig erscheinen. Aber es ist manchmal nützlich, ein bisschen so, als hätte man seine eigene Telefonnummer in seinem Smartphone-Repertoire. - der
..
Einstiegspunkte zum übergeordneten Verzeichnis. Da die Dateihierarchie auf Unix-ähnlichen Systemen strikt als Baum organisiert ist, hat jedes Verzeichnis genau ein übergeordnetes Verzeichnis. Außer dem Stammverzeichnis/
kann sein? Nun, nicht wirklich:Das Elternverzeichnis des Root-Verzeichnisses ist … das Root-Verzeichnis selbst.
# Default behavior: do not display hidden entries
# (including . and ..)
sh:~/ls$ ls
a c e hardlink-to-file symlink-to-file
b dir f link-to-subdir symlink-to-subdir
# `-a` option: show hidden files and directories
sh:~/ls$ ls -a
. a c e hardlink-to-file link-to-subdir symlink-to-subdir
.. b dir f .hidden symlink-to-file
Die nützlichen Optionen des ls-Befehls
Nachdem Sie das bekannte -l
überprüft haben , -d
und -a
richten wir unsere Aufmerksamkeit auf ein paar weniger bekannte Optionen, die ich besonders nützlich finde.
-s
:Zugewiesene Größe anzeigen
Sie erinnern sich vielleicht an das -l
Option zeigte die Anzahl der Bytes in der Datei an. Das -s
Option zeigt die zugewiesene Größe in Blöcken an. Was ist ein Block? Nun, eine Gruppe von Bytes, deren Größe von der Implementierung abhängt. Es ist normalerweise 512 Bytes auf BSD und 1024 Bytes auf Linux.
Warum sollte ich mich mit der Größe in Blöcken beschäftigen, wenn ich bereits Zugriff auf die Größe in Bytes habe? Nun, die -s
Optionen zeigen die zugewiesenen an Größe. Nicht das logische Größe der Datei. Das können zwei völlig verschiedene Dinge für Sparse-Dateien sein. Sparse-Dateien sind Dateien, die „Löcher“ enthalten. Beim Lesen verhalten sich diese Löcher wie normale Dateiblöcke, die nur Nullen enthalten. Aber sie nehmen praktisch keinen Platz auf der Festplatte ein. Wir können den dd
verwenden Befehl mit dem seek
Option zum Erstellen von Sparse-Dateien, wie ich es für b
getan habe Datei in meiner Beispielhierarchie:
sh:~/ls$ ls -ls a b
2052 -rw-r--r-- 1 sylvain sylvain 2097152 Sep 19 22:18 a
1028 -rw-r--r-- 1 sylvain sylvain 2097152 Sep 19 22:18 b
Wie Sie sehen können, sind sowohl mein a
und b
Dateien scheinen zwei Mebibyte lang zu sein. Aber das b
Da die Datei spärlich ist, benötigt sie nur 1028 Blöcke auf der Festplatte (ungefähr ein Mebibyte).
-h
menschenlesbare Größen anzeigen
Mit dem -h
Option ls
zeigt Dateigrößen mit Einheitensuffixen an, um sie benutzerfreundlicher zu machen. Diese Option ist nur in Kombination mit dem -l
sinnvoll Option (Linux, BSD) oder -s
(Linux):
sh:~/ls$ ls -lsh a b
2.1M -rw-r--r-- 1 sylvain sylvain 2.0M Sep 19 22:18 a
1.1M -rw-r--r-- 1 sylvain sylvain 2.0M Sep 19 22:18 b
openbsd-6.3$ ls -lsh a b
4128 -rw-r--r-- 1 sylvain sylvain 2.0M Sep 19 23:49 a
2112 -rw-r--r-- 1 sylvain sylvain 2.0M Sep 19 23:49 b
Sie haben vielleicht bemerkt, dass Größen mit Potenzen von 1024 Einheiten angezeigt werden, wobei K für 2 ^ 10 =1024 Bytes steht, M für 1024 ^ 2 =1048576 Bytes und so weiter. Erwähnenswert ist hier das ls
Implementierung, die als Teil der GNU Coreutils bereitgestellt wird, hat einen zusätzlichen --si
Optionen zur Verwendung von Potenzen von 1000 anstelle von Potenzen von 1024:
sh:~/ls$ ls -lsh --si a b
2.2M -rw-r--r-- 1 sylvain sylvain 2.1M Sep 19 22:18 a
1.1M -rw-r--r-- 1 sylvain sylvain 2.1M Sep 19 22:18 b
-i
Inode-Nummer anzeigen
Auf einem Dateisystem im Unix-Stil ist eine Inode-Nummer (oder Dateiseriennummer in der POSIX-Terminologie) ist eine Nummer, die ein Dateisystemobjekt eindeutig identifiziert (eine Datei, ein Verzeichnis, eine Named Pipe, … ). Mit dem -i
Option, die ls
Der Befehl zeigt seine Inode-Nummer neben jedem Pfad an.
Auch wenn es etwas exotisch erscheint, finde ich mich mit dem -i
wieder Option von Zeit zu Zeit, insbesondere um Verzeichniseinträge zu identifizieren, die auf dasselbe Dateisystemobjekt verweisen. Sie werden diese Option hauptsächlich verwenden, wenn Sie Hardlinks oder Bind-Mounts untersuchen. Sehen Sie sich dieses Video für ein praktisches Beispiel an:https://youtu.be/Jp58Osb1uFo?t=140
sh:~/ls$ ls -i *
8222 a 8243 b 8262 c 8264 hardlink-to-file 8272 symlink-to-file
dir:
8263 d 8264 e 8265 f 8245 subdir 8261 subdir2
symlink-to-subdir:
8266 g 8267 h 8268 i
Im obigen Beispiel sehen Sie, dass jedem Dateinamen die Inode-Nummer vorangestellt ist, die diesem Pfad zugeordnet ist. Auf Ihrem System werden die Zahlen sicherlich abweichen. Sehen Sie sich auf jeden Fall den hardlink-to-file
genauer an und dir/e
Einträge. Beide haben dieselbe Inode-Nummer (in meinem Fall 8264). Das bedeutet, dass es sich um zwei Einträge handelt, die auf dasselbe zugrunde liegende Dateisystemobjekt verweisen – was tatsächlich die genaue Definition dessen ist, was ein harter Link ist.
Sie erinnern sich vielleicht, dass ich vorhin gesagt habe, dass das Stammverzeichnis selbst das Elternverzeichnis des Stammverzeichnisses ist. Durch die Verwendung des -i
Option, ist es ziemlich einfach, diese Behauptung zu überprüfen:
openbsd-6$ ls -id /
2 /
openbsd-6$ ls -ia /
2 . 25985 bin 5 dev 77954 sbin
2 .. 1235 boot 51969 etc 10 sys
8 .cshrc 1240 bsd 2 home 7 tmp
9 .profile 1241 bsd.booted 77953 mnt 2 usr
51968 altroot 4 bsd.rd 26016 root 78016 var
Wie Sie sehen können, ist das Stammverzeichnis auf meinem System mit der Inode-Nummer 2 verknüpft, die auch die Inode des übergeordneten Verzeichnisses ist. Das beweist also, dass das Root-Verzeichnis ist sein eigener Elternteil.
Die selten verwendeten Optionen des ls-Befehls
Ich verwende regelmäßig die im vorherigen Abschnitt beschriebenen Optionen, aber über die werde ich jetzt sprechen … nun ja … ich weiß, dass es sie gibt. Allerdings muss ich zugeben, wenn ich sie brauche, muss ich oft zum man
schauen um mein Gedächtnis aufzufrischen.
-L
:Informationen über das Ziel der symbolischen Links anzeigen
Diese Option modifiziert das Verhalten von ls
Befehl, wenn er auf symbolische Links angewendet wird. Mit dem -L
Option ls
zeigt die Informationen über das Ziel an des symbolischen Links, anstatt diejenigen anzuzeigen, die sich auf den symbolischen Link selbst beziehen. Anhand des folgenden Beispiels wird der Unterschied deutlich:
# Pay special attention to the permission
# and file size for symbolic links with and without
# the `-L` option:
sh:~/ls$ ls -ld *
-rw-r--r-- 1 sylvain sylvain 2097152 Sep 20 00:09 a
-rw-r--r-- 1 sylvain sylvain 2097152 Sep 20 00:09 b
-rw-r--r-- 1 sylvain sylvain 0 Sep 20 00:09 c
drwxr-xr-x 4 sylvain sylvain 4096 Sep 20 00:09 dir
-rw-r--r-- 2 sylvain sylvain 0 Sep 20 00:09 hardlink-to-file
lrwxrwxrwx 1 sylvain sylvain 5 Sep 20 00:09 symlink-to-file -> dir/f
lrwxrwxrwx 1 sylvain sylvain 10 Sep 20 00:09 symlink-to-subdir -> dir/subdir
[email protected]:/tmp/ls/ls/ls$ ls -lLd *
-rw-r--r-- 1 sylvain sylvain 2097152 Sep 20 00:09 a
-rw-r--r-- 1 sylvain sylvain 2097152 Sep 20 00:09 b
-rw-r--r-- 1 sylvain sylvain 0 Sep 20 00:09 c
drwxr-xr-x 4 sylvain sylvain 4096 Sep 20 00:09 dir
-rw-r--r-- 2 sylvain sylvain 0 Sep 20 00:09 hardlink-to-file
-rw-r--r-- 1 sylvain sylvain 0 Sep 20 00:09 symlink-to-file
drwxr-xr-x 2 sylvain sylvain 4096 Sep 20 00:09 symlink-to-subdir
-F
:Ein Klassifizierungszeichen an den Dateinamen anhängen
Das -F
fügt ein zusätzliches Zeichen nach dem Pfadnamen einiger Kategorien von Dateisystemobjekten hinzu, um sie zu identifizieren. Es wird hinzugefügt:
- ein
\
nach jedem Pfadnamen, der ein Verzeichnis ist, - ein
@
nach jedem Pfadnamen, der ein symbolischer Link ist, - ein
*
nach jeder ausführbaren Datei, - und ein
|
nach jedem FIFO (siehemkfifo
weitere Informationen dazu)
In meinen frühen Unix-Tagen habe ich diese Option häufig verwendet. Aber seit ls
kann seine Ausgabe einfärben (und da wir Farbmonitore haben!), brauche ich das selten. Aber ich erinnere mich daran. Und von Zeit zu Zeit finde ich auf einem entfernten Terminal eine Gelegenheit, es zu verwenden:
sh:~/ls$ ls -F
a b c dir/ hardlink-to-file [email protected] [email protected]
t
:Einträge nach Änderungszeit sortieren
Mit dem -t
Option, die ls
Befehl mit der Anzeige von Verzeichniseinträgen sortiert nach Änderungszeit (neueste zuerst) anstatt sie nach ihrem Namen zu sortieren:
# Default sort order (by filename)
sh:~/ls$ ls
a b c dir hardlink-to-file symlink-to-file symlink-to-subdir
# Sort by modification date
sh:~/ls$ ls -t
symlink-to-subdir symlink-to-file c dir hardlink-to-file b a
Wenn ich eine Datei ändere, erscheint sie jetzt als erster (dh zuletzt geänderter) Eintrag in der Liste:
sh:~/ls$ echo >> a
sh:~/ls$ ls -t
a symlink-to-subdir symlink-to-file c dir hardlink-to-file b
-S
:Einträge nach Größe sortieren
Mit dem -S
Option ls
zeigt Einträge nach Größe sortiert an, größte Datei zuerst. Bei Gleichstand werden die Einträge nach ihrem Pfadnamen sortiert:
sh:~/ls$ ls -lS
total 6244
-rw-r--r-- 1 sylvain sylvain 2097152 Sep 19 23:49 a
-rw-r--r-- 1 sylvain sylvain 2097152 Sep 19 23:49 b
drwxr-xr-x 4 sylvain sylvain 512 Sep 19 23:49 dir
lrwxr-xr-x 1 sylvain sylvain 10 Sep 19 23:49 symlink-to-subdir -> dir/subdir
lrwxr-xr-x 1 sylvain sylvain 5 Sep 19 23:49 symlink-to-file -> dir/f
-rw-r--r-- 1 sylvain sylvain 0 Sep 19 23:49 c
-rw-r--r-- 2 sylvain sylvain 0 Sep 19 23:49 hardlink-to-file
-r
:umgekehrte Sortierreihenfolge
Diese Option kehrt die Sortierreihenfolge um. Ich finde es am nützlichsten, wenn es mit dem -t
verknüpft ist Option, um die am längsten geänderte Datei zuerst anzuzeigen, oder mit dem -S
Option, um die kleinste Datei zuerst anzuzeigen. Aber es funktioniert auch mit der standardmäßigen Sortierreihenfolge nach Pfadnamen:
# Display the least recently modified file first
sh:~/ls$ ls -rt
b hardlink-to-file dir c symlink-to-file symlink-to-subdir a
# Display the smallest file first
sh:~/ls$ ls -rS
hardlink-to-file c symlink-to-file symlink-to-subdir dir b a
# Display path names in reversed alphabetical order
sh:~/ls$ ls -r
symlink-to-subdir symlink-to-file hardlink-to-file dir c b a
-n
:Numerische UID/GID anzeigen
Diese Option ist genau die gleiche wie -l
Option – außer mit -n
die Gruppen-ID (GID) und die Benutzer-ID (UID) des Eigentümers werden als Zahlen angezeigt, anstatt den zugehörigen Namen zu verwenden:
sh:~/ls$ ls -ld a b c /
drwxr-xr-x 28 root root 4096 May 6 00:28 /
-rw-r--r-- 1 sylvain sylvain 2097153 Sep 20 00:45 a
-rw-r--r-- 1 sylvain sylvain 2097152 Sep 20 00:09 b
-rw-r--r-- 1 sylvain sylvain 0 Sep 20 00:09 c
sh:~/ls$ ls -nd a b c /
drwxr-xr-x 28 0 0 4096 May 6 00:28 /
-rw-r--r-- 1 1000 1000 2097153 Sep 20 00:45 a
-rw-r--r-- 1 1000 1000 2097152 Sep 20 00:09 b
-rw-r--r-- 1 1000 1000 0 Sep 20 00:09 c
Die wirklich exotische Verwendung des ls-Befehls
Niemand kann behaupten, alles zu wissen. Und während ich diesen Artikel schrieb, habe ich ein paar ls
(wieder-)entdeckt Optionen. Ich kann mich nicht erinnern, sie selbst benutzt zu haben, aber vielleicht hast du es getan? Wenn dies der Fall ist, wäre ich neugierig, im Kommentarbereich zu lesen, unter welchen Umständen Sie sie nützlich finden. Wie dem auch sei, hier ist eine Auswahl, die Sie vielleicht interessieren könnte.
-R
:Unterverzeichnisse rekursiv auflisten
Standardmäßig ist die Datei ls
zeigt nur den Inhalt der explizit auf der Kommandozeile angegebenen Verzeichnisse an. Mit dem -R
Option, wird es auch rekursiv den Inhalt der gefundenen Verzeichnisse anzeigen:
sh:~/ls$ ls -R
.:
a b c dir hardlink-to-file symlink-to-file symlink-to-subdir
./dir:
d e f subdir subdir2
./dir/subdir:
g h i
./dir/subdir2:
j k l
Während ich theoretisch interessant bin, finde ich (Wortspiel beabsichtigt) die Ausgabe, die von find .
erzeugt wird Befehl besser lesbar für diesen Zweck. Aber Ihr Kilometerstand kann natürlich variieren:
sh:~/ls$ find .
.
./c
./.hidden
./hardlink-to-file
./b
./symlink-to-subdir
./dir
./dir/d
./dir/e
./dir/subdir2
./dir/subdir2/l
./dir/subdir2/j
./dir/subdir2/k
./dir/subdir
./dir/subdir/g
./dir/subdir/i
./dir/subdir/h
./dir/f
./symlink-to-file
./a
-A
:fast alle Dateien anzeigen
Obwohl nicht im POSIX-Standard definiert, ist -A
Optionen erscheinen sowohl in der GNU- als auch in der BSD-Welt. In beiden Fällen funktioniert es wie -a
, aber ohne .
und ..
Einträge. Erwähnenswert auf BSD-Systemen, -A
wird für den Superuser impliziert:
sh:~/ls$ ls -a
. a c hardlink-to-file symlink-to-file
.. b dir .hidden symlink-to-subdir
sh:~/ls$ ls -A
a b c dir hardlink-to-file .hidden symlink-to-file symlink-to-subdir
openbsd-6.3$ su root
openbsd-6.3# ls
.hidden a b c dir hardlink-to-file symlink-to-file symlink-to-subdir
-f
:nicht sortieren
Mit dem -f
Option ls
zeigt Einträge in der Reihenfolge an, in der sie im Verzeichnis erscheinen. Diese Reihenfolge hängt vom zugrunde liegenden Dateisystem ab, und die Reihenfolge der Dateien wurde erstellt, sodass sie kaum vorhersehbar ist. Das -f
Option impliziert auch das -a
Möglichkeit:
sh:~/ls$ ls -f
.. .hidden b dir a
c hardlink-to-file symlink-to-subdir symlink-to-file .
openbsd-6$ ls -f
. a c symlink-to-subdir
.. b hardlink-to-file
.hidden dir symlink-to-file
Amüsanterweise mit den GNU Coreutils 8.26 ls
Implementierung können Sie sowohl den -l
verwenden und -f
Optionen, wenn Sie es -fl
schreiben –aber nicht, wenn Sie -lf
schreiben . Auf OpenBSD funktionieren beide wie erwartet:
sh:~/ls$ ls -lf
.. .hidden b dir a
c hardlink-to-file symlink-to-subdir symlink-to-file .
sh:~/ls$ ls -fl
total 3100
drwxr-xr-x 3 sylvain sylvain 4096 Sep 19 12:09 ..
-rw-r--r-- 1 sylvain sylvain 0 Sep 20 00:09 c
-rw-r--r-- 1 sylvain sylvain 19 Sep 20 00:09 .hidden
-rw-r--r-- 2 sylvain sylvain 0 Sep 20 00:09 hardlink-to-file
-rw-r--r-- 1 sylvain sylvain 2097152 Sep 20 00:09 b
lrwxrwxrwx 1 sylvain sylvain 10 Sep 20 00:09 symlink-to-subdir -> dir/subdir
drwxr-xr-x 4 sylvain sylvain 4096 Sep 20 00:09 dir
lrwxrwxrwx 1 sylvain sylvain 5 Sep 20 00:09 symlink-to-file -> dir/f
-rw-r--r-- 1 sylvain sylvain 2097153 Sep 20 00:45 a
drwxr-xr-x 3 sylvain sylvain 4096 Sep 20 00:09 .
openbsd-6$ ls -lf
total 6256
drwxr-xr-x 3 sylvain sylvain 512 Sep 19 23:49 .
drwxr-xr-x 5 sylvain sylvain 512 Sep 19 23:49 ..
-rw-r--r-- 1 sylvain sylvain 19 Sep 19 23:49 .hidden
-rw-r--r-- 1 sylvain sylvain 2097152 Sep 19 23:49 a
-rw-r--r-- 1 sylvain sylvain 2097152 Sep 19 23:49 b
drwxr-xr-x 4 sylvain sylvain 512 Sep 19 23:49 dir
-rw-r--r-- 1 sylvain sylvain 0 Sep 19 23:49 c
-rw-r--r-- 2 sylvain sylvain 0 Sep 19 23:49 hardlink-to-file
lrwxr-xr-x 1 sylvain sylvain 5 Sep 19 23:49 symlink-to-file -> dir/f
lrwxr-xr-x 1 sylvain sylvain 10 Sep 19 23:49 symlink-to-subdir -> dir/subdir
openbsd-6$ ls -fl
total 6256
drwxr-xr-x 3 sylvain sylvain 512 Sep 19 23:49 .
drwxr-xr-x 5 sylvain sylvain 512 Sep 19 23:49 ..
-rw-r--r-- 1 sylvain sylvain 19 Sep 19 23:49 .hidden
-rw-r--r-- 1 sylvain sylvain 2097152 Sep 19 23:49 a
-rw-r--r-- 1 sylvain sylvain 2097152 Sep 19 23:49 b
drwxr-xr-x 4 sylvain sylvain 512 Sep 19 23:49 dir
-rw-r--r-- 1 sylvain sylvain 0 Sep 19 23:49 c
-rw-r--r-- 2 sylvain sylvain 0 Sep 19 23:49 hardlink-to-file
lrwxr-xr-x 1 sylvain sylvain 5 Sep 19 23:49 symlink-to-file -> dir/f
lrwxr-xr-x 1 sylvain sylvain 10 Sep 19 23:49 symlink-to-subdir -> dir/subdir
-q
:Nicht druckbare Dateinamenzeichen als ?
anzeigen
Auf Dateisystemen im Unix-Stil kann ein Dateiname jedes Zeichen außer \
enthalten und die NUL-Zeichen. Dies bedeutet, dass ein Dateiname nicht druckbare Zeichen oder sogar Steuersequenzen enthalten kann, die Ihr Terminal stören können. Versuchen wir etwas Amüsantes:
touch "$(echo -e '\x1B[7mBOO\x1B[0m')"
Offensichtlich enthält dieser Dateiname nicht druckbare Zeichen. Über moderne Implementierungen von ls
, das -q
Option ist impliziert, wenn die Ausgabe ein Terminal ist, um mögliche schädliche Auswirkungen zu vermeiden. Die nicht druckbaren Zeichen werden also durch ein Fragezeichen ersetzt:
sh:~/ls$ ls *BOO*
?[7mBOO?[0m
Anders sieht es jedoch aus, wenn Sie stattdessen Folgendes schreiben:
# I let you try that by yourself
# to not spoil the fun;)
sh:~/ls$ ls *BOO* | cat
Der | cat
ist nutzlos, aber als Nebeneffekt wird der ls
Der Befehl sieht jetzt eine Pipe auf seiner Standardausgabe anstelle eines tty (ein „Terminal“). Da die Ausgabe kein Terminal mehr ist, wird der -q
Option ist nicht mehr impliziert, und ls
zeigt den Dateinamen wörtlich an. In diesem Fall, wenn alles wie erwartet funktioniert, um den Dateinamen mit einem abgefahrenen Videoeffekt zu präsentieren.
Explizit mit dem -q
Option würde das beheben. Ich werde Sie das selbst ausprobieren lassen (und eventuell mit anderen ANSI-Escape-Sequenzen spielen). Aber ich nutze diese Gelegenheit, um Sie davor zu warnen, ls
zu verwenden Befehl in Shell-Skripten. In der Praxis ist ls
ist für den „menschlichen Verzehr“ bestimmt. Es gibt viele Nebenfälle in Bezug auf speziell gestaltete Dateinamen, die sehr schwer richtig zu handhaben sind. Wenn Sie eine Liste von Dateien durchgehen müssen, empfehle ich Ihnen dringend, stattdessen den Befehl find zu verwenden. Im einfachsten Fall ein einfacher for
Schleife ist sogar ausreichend – aber das wäre eine andere Geschichte.
for f in *; do echo "$f"; done
Das Ende?
Damit ist unsere Tour durch die ls
abgeschlossen Befehlsoptionen. Es ist unnötig zu erwähnen, dass es bei weitem nicht erschöpfend war, und ich habe versucht, mich hier auf die nützlichsten und portabelsten Optionen zu konzentrieren. Aber jeder ls
Die Implementierung hat ihren Anteil an coolen Funktionen. Wenn Sie also eine nette Option kennen, die ich in diesem Artikel vermisst habe, zögern Sie nicht, uns diese über den Kommentarbereich mitzuteilen. Wenn wir genug Feedback haben, können wir sie sogar in einem Folgeartikel zusammenstellen und veröffentlichen!
Apropos ls-Befehl, kennen Sie den lsof-Befehl? Es hat nichts mit ls zu tun, aber es sagt Ihnen, welcher Benutzer auf eine bestimmte Datei zugreift.