# ls-Befehl



## oraclin25 (11. Juni 2012)

Hallo zusammen,

ich lerne gerade Shell-Skript-Programmierung(bash).  Mein Problem:

Warum funktioniert das hier?

ls -l `find . -name "*.txt"`

ls -l 
listet mir doch alle Dateien mit dazugerhörigen Rechten im entsprechenden Verzeichnis auf.

Die Kommando-Substitution `find . -name "*.txt"` 
Das Ergebnis von der Kommando-Substituion ist doch aber eine Menge von Dateinamen, also kein Verzeichnis.  

Ist dies etwas, was man einfach "lernen" muss?

Viele Grüße aus Rheinland,
Eure Ratna


----------



## deepthroat (11. Juni 2012)

Hi.

Deine Prämisse ist falsch. ls listet die Dateien (Verzeichnisse sind auch Dateien) auf die als Argumente übergeben werden. Falls keine Argumente angegeben sind, wird das aktuelle Arbeitsverzeichnis aufgelistet.

Gruß


----------



## oraclin25 (12. Juni 2012)

Hallo deepthroat,

danke für Deine Antwort.  

ls -l `find . -name "*.txt"`

hier listet ls alle Dateien aus dem aktuellen Verzeichnis.  Soweit ist es schon mal.  Es ist für mich unheimlich schwer zu akzeptieren, dass die Kommando-Substitution `find . -name "*.txt"` in diesem Fall als einer Art Nebenbedingung dient.  
Es ist ja wie:
"liste mir alle Dateien, die sich im aktuellen Verzeichnis befinden, und zwar mit der Bedingung, dass die Dateien die Endung .txt besitzen"

Ich kenne Kommando-Subsitution nur als ein Objekt, das nach der Ausführung in einer Variablen abgespeicher wird.  Wie zum Beispiel:
variablenname=`Kommando`

Aber als Nebenbedingung?  

Ich meine, ich kann das hier als eine Art Ausnahme lernen, aber perfekt ist es dann nicht.  Aber vielleicht rede ich ja Quatsch ist, das kann gut sein, bin nicht allzu lange in der Unix-Welt.  

Schöne Grüße aus Rheinland,
Eure Ratna


----------



## deepthroat (12. Juni 2012)

oraclin25 hat gesagt.:


> Ich meine, ich kann das hier als eine Art Ausnahme lernen


Wieso Ausnahme?

Die Kommando-Substitution funktioniert doch immer gleich: bevor der eigentlich Befehl ausgeführt wird, wird an die Stelle der $() bzw. ``die Ausgabe des angegebenen Befehls ersetzt. Das hat nichts mit Bedingungen zu tun, sondern nur mit Ersetzung von Text / Wörtern.

Gruß


----------



## oraclin25 (12. Juni 2012)

ach so okay.. danke vielmals.  Ich hatte einen Denkfehler, ich dachte, ls nimmt lediglich ein Verzeichnis als Parameter.  "Normale" Dateien nimmt ls auch.  Danke.

dieses funktioniert nicht:

find . -name "*.txt" | ls -l

Also, soweit ich weiss:
Ich wollte eigentlich das Ergebnis von find als Standardeingabe für ls übergeben.  Tut aber leider nicht.  

Schöne Grüße aus Rheinland,
Eure Ratna


----------



## deepthroat (12. Juni 2012)

oraclin25 hat gesagt.:


> ach so okay.. danke vielmals.  Ich hatte einen Denkfehler, ich dachte, ls nimmt lediglich ein Verzeichnis als Parameter.  "Normale" Dateien nimmt ls auch.  Danke.


ls nimmt alle Dateien. auch Verzeichnisse. 


oraclin25 hat gesagt.:


> dieses funktioniert nicht:
> 
> find . -name "*.txt" | ls -l


Natürlich nicht. ls liest nichts von der Standardeingabe.

Dafür gibt es xargs:

```
find . -name "*.txt" -print0 | xargs -r0 ls -l
```
Gruß


----------



## ikosaeder (13. Juni 2012)

Es geht aber noch einfacher mit ls -l *.txt


----------



## deepthroat (14. Juni 2012)

ikosaeder hat gesagt.:


> Es geht aber noch einfacher mit ls -l *.txt


Das ist nicht das gleiche. find arbeitet rekursiv.

Gruß


----------



## ikosaeder (22. Juni 2012)

ls kann auch rekursiv:
ls -lR | grep txt


----------



## deepthroat (22. Juni 2012)

ikosaeder hat gesagt.:


> ls kann auch rekursiv:
> ls -lR | grep txt


Ist aber auch nicht dasselbe, da alle Dateien gefunden werden die irgendwo das Wort txt enthalten, nicht nur solche die auf .txt enden.

Außerdem erhält man so nicht den vollständigen Pfad der Dateien, sondern nur deren Namen.

Gruß


----------

