Ich sollte nur Namen von Dateien oder Verzeichnissen mit dieser Konstruktion ausgeben:
ls -Al | while read string
do
...
done
ls -Al
Ausgabe :
drwxr-xr-x 12 s162103 studs 12 march 28 12:49 personal domain
drwxr-xr-x 2 s162103 studs 3 march 28 22:32 public_html
drwxr-xr-x 7 s162103 studs 8 march 28 13:59 WebApplication1
Zum Beispiel, wenn ich versuche:
ls -Al | while read string
do
echo "$string" | awk '{print $9}
done
dann nur Dateien und Verzeichnisse ohne Leerzeichen ausgeben. Wenn eine Datei oder ein Verzeichnis Leerzeichen wie "Persönliche Domain" enthält, ist dies nur das Wort "Persönlich".
Ich brauche eine sehr einfache Lösung. Vielleicht gibt es eine bessere Lösung als awk.
linux
command-line
ls
Alex Zern
quelle
quelle
ls -Al *' '*
?ls
Die Ausgabe von Parsing führt nie zu etwas Gutem.ls -Al | while
. Ein einfacher und zuverlässiger Weg istfor string in *; do echo "$string"; done
.ls
? Parsingls
und "Arbeit in allen * nix und wird nicht brechen, wenn etwas passiert" passen nicht gut zusammen.Antworten:
Sie sollten die Ausgabe von wirklich nicht analysieren
ls
. Wenn dies eine Hausaufgabe ist und Sie dazu aufgefordert werden, weiß Ihr Professor nicht, wovon sie sprechen. Warum machst du nicht so etwas:Der gute...
oder
...das Schlechte...
Wenn Sie wirklich wirklich verwenden möchten
ls
, können Sie es ein wenig robuster machen, indem Sie Folgendes tun:... und das hässliche
Wenn Sie darauf bestehen , es auf die falsche, gefährliche Weise zu tun, und nur eine
while
Schleife verwenden müssen, gehen Sie folgendermaßen vor:Aber im Ernst, tu es einfach nicht.
quelle
drwx------ 2 s162103 studs 3 oct. 9 2012 .ssh drwxr-xr-x 3 s162103 studs 6 oct. 25 09:02 .subversion drwxrwxrwt 3 s162103 studs 3 nov. 15 2012 .TempoItems
manchmal habe ich date ohne zeit, nur jahr und gawk kehren leer zurückls
.-l
switch überhaupt? Wenn Sie nur die Dateinamen möchten, führen Sie einfach ausls -A
. Das Verwenden von-l
macht Ihnen das Leben nur schwerer, da Sie jetzt die Ausgabe analysieren müssen.ls
ist einfach nicht der beste Weg, um das zu bekommen, was Sie brauchen. Warum posten Sie nicht eine neue Frage, in der die Informationen erläutert werden, die Sie sammeln möchten, und wir können Ihnen Möglichkeiten vorschlagen, dies zu tun. Alternativ können Sie Ihr Skript so verwenden, wie es ist, und einen der obigen Vorschläge verwenden, um nur den Namen zu drucken. Aber im Ernst, analysieren Sie nicht, sondernls
sagen Sie uns genau, was Sie in einer neuen Frage versuchen.Gibt es einen Grund, warum
ls -A1
* nicht funktioniert?Z.B:
* Hinweis: Das ist ein Großbuchstabe A und die Nummer eins.
quelle
Ich frage mich, warum niemand diesen einfachen Befehl erwähnt hat:
quelle
sort
das Leiten zu bewirkt , dass ein mehrspaltiger Block in eine einzelne Spalte aufgehoben wird?ls
aufls -1
(einspaltige Ausgabe) zurückgesetzt wird, wenn die Ausgabe nicht an ein Terminal gesendet wird (und nicht druckbare Anführungszeichen / Ersetzungen deaktiviert werden; @Kusalananda,ls
wenn dies immer noch der Fall ist, sind Sie nicht POSIX-kompatibel).ls
Die Ausgabe ist bereits sortiert.sort
Wenn Sie es also weiterleiten , wird im besten Fall nichts unternommen, und im schlimmsten Fall wird die Ausgabe beschädigt (wenn Dateinamen Zeilenumbrüche enthalten), oder bei Dateinamen, die kein Text sind, schlägt dies fehl.ls -a | cat
wäre besser. Oder noch besser,ls -A1
wie bereits erwähnt (und weil Sie in der Regel das Ersetzen / Zitieren möchten, wenn auf einem Terminal angezeigt)ls
verhält sich anders, wenn der Ausgang kein Terminal ist.Sie können die Ausgabe von nicht analysieren
ls
, geschweige denn,ls -l
weil Zeilenumbrüche genauso gültig sind wie Leerzeichen in Dateinamen. Außerdem müssen Sie Symlinks berücksichtigen, die eine Ausgabe wie haben... foo -> bar
.Warum würden Sie
-l
sowieso verwenden, wenn Sie nur den Dateinamen möchten?Mach einfach:
Wenn Sie Punktedateien einschließen möchten (außer
.
und..
), abhängig von der Shell:zsh
:bash
:ksh93
:POSIXly:
quelle
Wie wäre es mit:
quelle
komprimiere mehrere Leerzeichen in einzelne Leerzeichen mit tr, dann kannst du cut benutzen, um die Felder zu teilen
quelle
Versuchen Sie (
bash
,zsh
,ksh93
Syntax):Siehe auch:
ls
? bei unix SEquelle
versuchen Sie
ls -1
Thats Integer 1Aus der Manpage.
quelle
Es zeigt an, welche Dateien sich in welchem Verzeichnis befinden.
quelle