Welchen Delimiter für cut und ls
Um eine Variable zu bezeichnen, möchte ich den Namen der 1. oder irgendeiner Datei eines bestimmten Musters mit basename oder sonstwie bestimmen. Das bringt nicht das gewünschte Ergebnis files=`ls *.txt | cut -f 1 -d" "` Es werden alle txt-Dateien gelistet, vermutlich weil -d" " nicht stimmt. Al
Hi Al, On Tue, Dec 16, 2003 at 06:58:14PM +0100, Al Bogner wrote:
Um eine Variable zu bezeichnen, möchte ich den Namen der 1. oder irgendeiner Datei eines bestimmten Musters mit basename oder sonstwie bestimmen.
Das bringt nicht das gewünschte Ergebnis files=`ls *.txt | cut -f 1 -d" "`
Es werden alle txt-Dateien gelistet, vermutlich weil -d" " nicht stimmt.
nein, weil ls alles *.txt listen soll. ls *.txt | while read TXT do #was auch immer done -- Guten Tag,ich bin die Freiheit so,jetzt kennt Ihr meinen Preis leider könnt Ihr ihn nicht zahlen auch wenn Ihr Bundesbürger heißt jetzt tragen wir die gleichen Farben doch sind wir alle gleich wollt Ihr die Mauer wiederhaben oder heim in Helmuts Reich Onkelz - Worte Der Freiheit
Am Dienstag, 16. Dezember 2003 19:11 schrieb Daniel Lord:
On Tue, Dec 16, 2003 at 06:58:14PM +0100, Al Bogner wrote:
Um eine Variable zu bezeichnen, möchte ich den Namen der 1. oder irgendeiner Datei eines bestimmten Musters mit basename oder sonstwie bestimmen.
Das bringt nicht das gewünschte Ergebnis files=`ls *.txt | cut -f 1 -d" "`
Es werden alle txt-Dateien gelistet, vermutlich weil -d" " nicht stimmt.
nein, weil ls alles *.txt listen soll.
ls *.txt | while read TXT do #was auch immer done
Also entweder ich kapiere es nicht oder es gibt ein Mißverständnis. Mit einer ähnlichen Syntax, bei der statt ls grep verwendet wird, funktioniert es so wie ich es mir vorstelle. zB: files=`ls *.txt` echo $files a.txt b.txt c.txt Als Ergebis will ich nun "a.txt" haben und in Folge mit basenam "a" Wozu brauche ich da "while"? Al
Hallo, Am Tue, 16 Dec 2003, Al Bogner schrieb:
Also entweder ich kapiere es nicht oder es gibt ein Mißverständnis.
Ja, siehe meine Mail dazu.
Mit einer ähnlichen Syntax, bei der statt ls grep verwendet wird, funktioniert es so wie ich es mir vorstelle.
zB: files=`ls *.txt` echo $files a.txt b.txt c.txt
Als Ergebis will ich nun "a.txt" haben und in Folge mit basenam "a"
files=`ls *.txt | head -1` -dnh -- Disclaimer: I do not have an orbital mind control laser; you are free to post your own opinion, but be prepared to back it up, because I *will* call you on it if I think it's bullshit. That's how the Internet, and life, works. -- Mark 'Kamikaze' Hughes
Hallo, Am Tue, 16 Dec 2003, Al Bogner schrieb:
Um eine Variable zu bezeichnen, möchte ich den Namen der 1. oder irgendeiner Datei eines bestimmten Musters mit basename oder sonstwie bestimmen.
Huh? Kapiere ich nicht.
Das bringt nicht das gewünschte Ergebnis files=`ls *.txt | cut -f 1 -d" "`
Es werden alle txt-Dateien gelistet, vermutlich weil -d" " nicht stimmt.
ls schreibt immer zeilenweise in eine pipe, also wie 'ls -1'. Was willst du denn machen? Sowas: files=`ls *.txt | head -n 1` -dnh -- 18: Vorbereitet für den Multimediaeinsatz Es sind noch zwei Slots auf dem Motherboard frei. (Peter Berlich)
Am Dienstag, 16. Dezember 2003 20:25 schrieb David Haller:
Huh? Kapiere ich nicht.
Da gibt es eigentlich nichts zu kapieren. Ich will eine Variable, die dann einen Dateinamen bildet, einfach ein bißchen beschreibender bezeichnen. Ich könnte genauso einen festen Dateinamen "sxmaxzu" :-) verwenden. Das liefert das zB, was ich wollte: neuername=`basename \`ls *.txt | head -n 1\` .txt` echo $neuername matrix Al
Hallo, Am Tue, 16 Dec 2003, Al Bogner schrieb:
Am Dienstag, 16. Dezember 2003 20:25 schrieb David Haller:
Huh? Kapiere ich nicht.
Da gibt es eigentlich nichts zu kapieren. Ich will eine Variable, die dann einen Dateinamen bildet, einfach ein bißchen beschreibender bezeichnen. Ich könnte genauso einen festen Dateinamen "sxmaxzu" :-) verwenden.
Das liefert das zB, was ich wollte:
neuername=`basename \`ls *.txt | head -n 1\` .txt`
Ah, das 'ls | head -1' war also was du gesucht hast ;) Nachtrag dazu: ==== info ls: *General output formatting ==== `-1' `--format=single-column' List one file per line. This is the default for `ls' when standard output is not a terminal ==== Und eine pipe ist eben kein terminal... Du solltest aber die Variablen quoten, weil du nicht sicherstellen kannst, dass du keine Leerzeichen (oder anderes) im Dateinamen hast. neu="`basename \"\`ls ~/*.txt | head -n 1\`\" .txt`" Du kannst dir aber das basename (in diesem Fall!) auch sparen und das ganze auch einfacher schreiben: neu="`ls *.txt | head -n 1`" neu="${neu##*\/}"; ### basename neu="${//%.txt}"; ### .txt$ entfernen echo "$neu" Insbesondere wenn du das "basename" in ner Schleife laufen laesst lohnt sich ein Test, ob das neu="${neu##*\/}"; neu="${//%.txt}"; geht, denn das ist shell-intern und deutlich schneller als basename zu starten: $ time for neu in `ls ~/*.txt`; do neu="${neu##*\/}"; echo "${neu//%.txt}"; done > /dev/null real 0m0.044s user 0m0.030s sys 0m0.010s $ time for neu in `ls ~/*.txt`; do echo `basename "${neu}" .txt`; done > /dev/null real 0m1.081s user 0m0.520s sys 0m0.550s $ ls ~/*.txt | wc -l 145 Ansonsten wuerde ich aber auch mit basename evtl. 2 Schritte draus machen: neu="`ls *.txt | head -n 1`" neu="`basename \"$neu\" .txt`" echo "$neu" Das ist einfach leichter :) -dnh -- == Re: MS' rules for creating 8.3's out of "long filenames" ==
Rules? There are *rules* for this? And there was I thinking it just inserted a few random characters based on your cat's star-sign, the number of milliseconds since your last bowel movement, and the instantaneous value of the Dow Jones Index! Nothing M$ makes is _that_ accurate. -- Tanuki, Shawn Latimer
Am Dienstag, 16. Dezember 2003 22:54 schrieb David Haller:
neu="`basename \"\`ls ~/*.txt | head -n 1\`\" .txt`"
Ansonsten wuerde ich aber auch mit basename evtl. 2 Schritte draus machen:
neu="`ls *.txt | head -n 1`" neu="`basename \"$neu\" .txt`" echo "$neu"
Das ist einfach leichter :)
Ja, jetzt habe ich mich schon so an die Einzeilen-Syntax gewöhnt, obwohl ich 2 Zeilen viel leichter zu lesen fand und nun das :-) Al
Hallo, Am Tue, 16 Dec 2003, Al Bogner schrieb:
Am Dienstag, 16. Dezember 2003 22:54 schrieb David Haller:
neu="`basename \"\`ls ~/*.txt | head -n 1\`\" .txt`"
Ansonsten wuerde ich aber auch mit basename evtl. 2 Schritte draus machen:
neu="`ls *.txt | head -n 1`" neu="`basename \"$neu\" .txt`" echo "$neu"
Das ist einfach leichter :)
Ja, jetzt habe ich mich schon so an die Einzeilen-Syntax gewöhnt, obwohl ich 2 Zeilen viel leichter zu lesen fand und nun das :-)
*tihihihiii* Es kommt eben immer darauf an was wie gemacht wird... :) "Know thy tools"[tm] -dnh PS: nur keine Angst, das Gefuehl was wann besser ist, das stellt sich mit der Erfahrung ein... --
Apropos: wie kann ich auf meiner HP Apollo 425 (HPUX 9.00) PDFs lesen? Argh, YKINOK! Ja, ist hier denn de.soc.subkultur.bsdm? HPUX, noch dazu 9.00 und ohne Compiler? Auf einer Kiste ohne CPU und ohne Speicher? Warum nimmst Du denn nicht gleich einen Abakus? Isst Du auch kleine Kinder mit Senf? -- KK in dasr
participants (3)
-
Al Bogner
-
Daniel Lord
-
David Haller