Bernd <
bna...@web.de>:
> Am 05.03.23 um 14:13 schrieb Peter J. Holzer:
>> On 2023-03-05 12:57, Bernd <
bna...@web.de> wrote:
>>> Am 04.03.23 um 17:02 schrieb Marcel Logen:
>>>> Probiere mal "ls -d *".
>>>
>>>
>>> Da ist das Ergebnis das gleiche wie bei ls ohne jede Option.
>>>
>>
>> Nein:
>>
>> % ls -a
>> ./ ../
>> % touch f1 f2
>> % mkdir d1 d2
>> % mkdir d1/f3 d1/f4
>> % ls *
>> f1 f2
>>
>> d1:
>> f3/ f4/
>>
>> d2:
>> % ls -d *
>> d1/ d2/ f1 f2
>>
>> Ohne -d wird bei Argumenten, die Directories sind, der Inhalt
>> angezeigt. Mit -d wird das Directory selbst angezeigt.
>
> Mein Order test war leer. Daher sah ich da keinen Unterschied.
> Jetzt ist es klar, danke.
>
> Ich nahm an das bei -d NUR die Ordner angezeigt werden. Es werden
> aber die Ordner der Ebene UND die Dateien der Ebene angezeigt.
Das ist in deinem Fall vielleicht zufällig richtig, aber
möglicherweise nicht aus dem Grund, aus dem du denkst, dass es so
sei. Dazu muss man Folgendes wissen:
Die allgemeine Aufrufsyntax von «ls» sieht so aus:
ls null oder mehr Optionen -- null oder mehr Namen
Wenn man «ls» keine Namen (man sagt auch: eine leere Liste von
Namen) von anzuzeigenden Dateien oder Verzeichnissen angibt, fügt
«ls» der leeren Liste von Namen gewissermaßen den Namen «.» (einen
einzelnen Punkt) hinzu: «ls» verhält sich im Folgenden so, als
hätte man es so
ls null oder mehr Optionen -- .
aufgerufen. Das macht «ls» für die bequemere Verwendung. Aber
man muss das für das Verständnis, wie «ls» funktioniert, im
Hinterkopf behalten.
Was fängt «ls» nun mit den Namen an?
Ich zäume jetzt das Pferd scheinbar von Schwanz auf und erkläre
erst, was «ls» tut, wenn es in der Liste der Optionen die Optionen
«-d» und «-U» findet:
Zunächst lässt sich «ls» für jeden Namen vom Betriebssystem
bestätigen, dass es eine Datei oder ein Verzeichnis dieses Namens
tatsächlich gibt. Wenn es vom Betriebssystem erfährt, dass es
einen Namen nicht gibt, spuckt es eine Fehlermeldung über diesen
Namen aus:
ls -d -- gibt_es_nicht
ls: Zugriff auf gibt_es_nicht nicht möglich: Datei oder
Verzeichnis nicht gefunden
Was «ls» zu den Namen, die ihm das Betriebssystem bestätigt hat,
ausgibt, hängt von den weiteren Optionen ab. Ohne weitere Optionen
(außer «-d») gibt «ls» nur den jeweiligen Namen aus. (Das ist
nicht viel Information.)
In welcher Reihenfolge «ls» seine Ausgaben macht, hängt von der
Option «-U» ab: Ohne die Option «-U» sortiert «ls» die Namen
zunächst, bevor es irgendwelche Ausgaben macht. Die
Sortierkriterien hängen von weiteren «ls»‐Optionen ab (genaueres
weiß das Handbuch).
Gehaltvoller wird die Ausgabe, wenn man die Option «-l» angibt.
Dann gibt «ls» außer dem Namen unter anderem auch aus, ob der Name
zu einem Verzeichnis, einer Datei oder einem anderen «Ding» (der
engl. Fachbegriff dazu heißt «inode») im Dateisystem gehört, wem
das vom Namen bezeichnete Inode gehört, zu welcher Gruppe es gehört,
die Zugriffsrechte und noch weitere Informationen (siehe das
Handbuch zu «ls»).
Wenn «ls» in der Liste der angegebenen Optionen die Option «-d»
nicht findet, weicht es im Fall, dass ein Name ein Verzeichnis
(oder ein symbolic link, das auf ein Verzeichnis zielt) bezeichnet,
vom eben beschriebenen Verhalten ab: Es erfragt vom Betriebssystem
den Inhalt des Verzeichnisses, d.h. die in ihm liegenden Namen von
Inodes. Dann gibt es zunächst den Namen des Verzeichnisses und
dahinter einen Doppelpunkt aus und in den folgenden Zeilen die
Namen der Inodes (und je nach Optionen weitere Informationen über
das Verzeichnis und über die Inodes) aus.
> Will man nur die Ordner der aktuellen Ebene sehen, hilft ls -d */
> anstelle von ls -d * (siehe Lutz' Antwort)
Ja, und zwar aus folgendem Grund: «*/» in der Kommandozeile
veranlasst den Shell, zunächst mit Hilfe des Betriebssystem die
Namen von Verzeichnissen (und von symbolic links, die auf
Verzeichnisse zielen), die auf das Namensmuster «*» passen, zu
ermitteln. Die Namen, die er erhält, sortiert er alphabetisch.
Dann startet er das Programm «ls» statt mit dem Namen «*/» mit
dieser Namensliste, wobei jeder Name am Schluß einen «/» erhält.
(Was geschieht, wenn die Namensliste leer ist, hängt vom Shell und
davon, wie der Shell eingestellt ist, ab. Siehe kürzlich den
News‐Beitrag mit dem Betreff «Heulen und Zaehneklappen beim
POSIX-Shell-Globbing».)
Beispiel:
In einem leeren Verzeichnis lasse ich die folgenden Kommandos
laufen:
touch -- Datei_B Datei_A
mkdir -- Verzeichnis_B Verzeichnis_A
Das Kommando
ls -d -U -- */
liefert dann die Ausgabe
Verzeichnis_A/
Verzeichnis_B/
Nach jedem Verzeichnisnamen folgt ein «/», weil «ls» vom Shell die
Verzeichnisnamen mit «/» hinten dran erhalten hat.
Das Kommando
ls -d -U -- *
liefert dann die Ausgabe
Datei_A
Datei_B
Verzeichnis_A
Verzeichnis_B
Hier stehen keine «/» hinter den Verzeichnisnamen, weil «ls» vom
Shell die Verzeichnisnamen (wie auch die Dateinamen) ohne «/»
hinten dran erhalten hat.