staging.inyokaproject.org

map

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |
Dieses Thema ist die Diskussion des Artikels map.

noisefloor Team-Icon

Ehemaliger
Avatar von noisefloor

Anmeldungsdatum:
6. Juni 2006

Beiträge: 28316

Hallo,

kleiner Wikiartikel zu einem kleinem Hilfsprogramm im Terminal.

Gruß, noisefloor

Heinrich_Schwietering Team-Icon

Wikiteam
Avatar von Heinrich_Schwietering

Anmeldungsdatum:
12. November 2005

Beiträge: 11288

Moin!

Es fehlt eine Fremdsoftware-Warnung, und externe Links werden mit Fähnchen versehen. 😕 Wohin soll der Wikilink file führen? Ansonsten kurz und knackig, wenngleich sich mir nicht so ganz erschließt, worum es dabei geht...

so long
hnak

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17432

@Heinrich:

Da hat sicher jmd. seine Nase ins Funktionale Programmieren gesteckt, und daraufhin ein map-Funktion in der Shell vermisst.

@noisefloor:

Beispiel: im folgenden Beispiel dient als Eingabe die Ausgabe des Befehls ls, der Eingabe die Variable f zugewiesen und dann auf jede Zeile file angewendet.

1
ls | map f 'file $f"' 

Der Text ist durcheinander und bruchstückhaft, oder?

Was meinst Du dazu:

Im folgenden Beispiel dient als Eingabe die Ausgabe des Befehls ls. Jede Eingabe wird iterativ der Variablen f zugewiesen und dann file auf jede Zeile angewendet.

Programmkritik: Die Homepage räumt ein, dass xargs und find mächtigere Werkzeuge sind und dass das Programm mit Whitespace im Dateinamen nicht klarkommt; ein Problem dem man mit einem tiefen Seufzer zustimmen kann. Es wird jedoch nicht erwähnt, dass xargs und find die besseren Optionen sein können, um eine ganze Reihe an Dateien auf einmal an ein Programm zu übergeben, bzw. dass viele Programme das von sich aus anbieten:

1
2
3
4
5
6
7
wc -m *.java 
 906 Foo.java
1859 KreisTest.java
 380 ListArrayList.java
1593 kreise-und-punkt.java
3977 mi-session.java
8715 insgesamt

Wen die Ausgabe der Gesamtzeichen stört, der müsste freilich zusätzlich head kennen:

1
2
3
4
5
6
 wc -m *.java | head -n -1
 906 Foo.java
1859 KreisTest.java
 380 ListArrayList.java
1593 kreise-und-punkt.java
3977 mi-session.java

Mit map zum Vergleich:

1
ls *.java | map zeile 'wc -m $zeile' 

Auch das Programm file nimmt gerne viele Argumente entgegen und hat auch keine Probleme mit Whitespace im Dateinamen:

1
2
3
4
5
6
file *.java 
Foo.java:              UTF-8 Unicode text
KreisTest.java:        C++ source, ASCII text
ListArrayList.java:    C source, ASCII text
kreise-und-punkt.java: C++ source, ASCII text
mi-session.java:       C++ source, UTF-8 Unicode text

Inhaltlich keine Sternstunde von file, aber man beachte, dass die Ausgabe blockweise formatiert ist. Dagegen liefert map wohl (nachgestellt mit einer for-Loop):

1
2
3
4
5
6
for f in *.java ; do file $f ; done 
Foo.java: UTF-8 Unicode text
KreisTest.java: C++ source, ASCII text
ListArrayList.java: C source, ASCII text
kreise-und-punkt.java: C++ source, ASCII text
mi-session.java: C++ source, UTF-8 Unicode text

und inhaltlich natürlich keinen Deut besser.

Für die GNU-coreutils ist es typisch, dass man sie mit mehreren Dateien aufrufen kann, d.h. es ist wohl schwierig Beispiele zu finden, wo map aufgrund von Simplizität überzeugt und das wiederholt benutzte Programm halbwegs bekannt ist.

noisefloor Team-Icon

Ehemaliger
(Themenstarter)
Avatar von noisefloor

Anmeldungsdatum:
6. Juni 2006

Beiträge: 28316

Hallo,

Vorschläge / Korrekturen umgesetzt.

@user_unknown: wie praktisch / sinnvoll das Programm wirklich ist (oder auch nicht) muss letztendlich jeder selber für sich entscheiden. Ich habe keinen, bin aber zufällig über das Programm gestolpert und dann den kurzen Artikel dazu geschrieben. Vielleicht braucht's irgendwer irgendwann. Vielleicht hat auch irgendwer mal bessere Beispiele für map als die im Artikel... 😉

Gruß, noisefloor

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 7816

Diesen Befehl verstehe ich nicht:

ls | map f 'file $f"' 

Ich kenne map nicht, aber vermute falsches Quoting. Vielleicht ist gemeint:

  • ls | map f 'file "$f"' 

noisefloor Team-Icon

Ehemaliger
(Themenstarter)
Avatar von noisefloor

Anmeldungsdatum:
6. Juni 2006

Beiträge: 28316

Stimmt, da fehlte ein ". Korrigiert.

Gruß, noisefloor

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 7816

Der als Beispiel verwendete Befehl

ls | map zeile 'wc -m $zeile' 

funktioniert natürlich grundsätzlich, liefert aber Fehlermeldungen. wenn es im Arbeitsverzeichnis neben den regulären Dateien noch weitere Ordner oder andere Dateiarten gibt, weil wc eben nur mit regulären Dateien etwas sinnvolles anfangen kann.

Dieser erweiterte Befehl sollte das vermeiden:

 ls | map zeile 'test -f $zeile && wc -m $zeile' 

mubuntuHH Team-Icon

Projektleitung

Anmeldungsdatum:
28. November 2010

Beiträge: 845

kB schrieb:

Dieser erweiterte Befehl sollte das vermeiden:

 ls | map zeile 'test -f $zeile && wc -m $zeile' 

Keine Reaktion des Artikelautors werte ich mal als Zustimmung und habe es entsprechend editiert.

Der Artikel ist nun online. Vielen Dank, noisefloor!

Was noch fehlt, ist eine Links-Sektion, die bei einen Terminalprogramm, das mit args und awk verwandt ist, bestimmt leicht mit sinnvollen Links gefüllt werden kann.

Antworten |