/ Forside / Teknologi / Operativsystemer / Linux / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Linux
#NavnPoint
o.v.n. 11177
peque 7911
dk 4814
e.c 2359
Uranus 1334
emesen 1334
stone47 1307
linuxrules 1214
Octon 1100
10  BjarneD 875
script ting
Fra : thomas


Dato : 10-08-04 09:44

Hej

er der en som kan vise mig hvordan man laver en search and replace med
flere filer

jeg er kommet så langt

find -type f -name *.h | xargs sed -s 's/BOOL/fBOOL/g'

med kan ikke komme længere

--
thomas

 
 
Peter Makholm (10-08-2004)
Kommentar
Fra : Peter Makholm


Dato : 10-08-04 09:47

thomas <thomas@momail.ik> writes:

> jeg er kommet så langt
>
> find -type f -name *.h | xargs sed -s 's/BOOL/fBOOL/g'

Problemet er at du enten skal til at fedte med temporærer filer,
hvilket er svært med xargs, eller også skal du lave inline redigering,
hvilket sed traditionelt ikke kan.

Men se om din sed har en -i option der laver inline redigering og så
brug den.

--
Peter Makholm | Wisdom has two parts:
peter@makholm.net | 1) having a lot to say, and
http://hacking.dk | 2) not saying it

thomas (10-08-2004)
Kommentar
Fra : thomas


Dato : 10-08-04 09:51

Peter Makholm wrote:
> thomas <thomas@momail.ik> writes:
>
>
>>jeg er kommet så langt
>>
>>find -type f -name *.h | xargs sed -s 's/BOOL/fBOOL/g'
>
>
> Problemet er at du enten skal til at fedte med temporærer filer,
> hvilket er svært med xargs, eller også skal du lave inline redigering,
> hvilket sed traditionelt ikke kan.
>
> Men se om din sed har en -i option der laver inline redigering og så
> brug den.
>
tak jeg prøver

Thorbjoern Ravn Ande~ (10-08-2004)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 10-08-04 09:49

thomas <thomas@momail.ik> writes:

> er der en som kan vise mig hvordan man laver en search and replace med
> flere filer

Perls -i flag er rigtigt godt til den slags ting.
--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk - Unix, Java, Web, Netværk, Århus

Michael U. Hove (10-08-2004)
Kommentar
Fra : Michael U. Hove


Dato : 10-08-04 17:05

thomas wrote:
> Hej
>
> er der en som kan vise mig hvordan man laver en search and replace med
> flere filer
>
> jeg er kommet så langt
>
> find -type f -name *.h | xargs sed -s 's/BOOL/fBOOL/g'
>
> med kan ikke komme længere
>
> --
> thomas

Kan ikke nok perl til at lave en kryptisk one-liner , men hvad med et
godt gammelt sh-script ala:

#!/bin/bash

for file in *.h
do
cp $file $file.bak
sed 's/foobar/FOOBAR/g' $file > $file.new
mv $file.new $file
echo "$file is done..."
done

/mvh
michael

--
"When you are not practicing, remember, someone, somewhere is
practicing, and when you meet him he will win."
Ed Macauley.

Thomas Rasmussen (10-08-2004)
Kommentar
Fra : Thomas Rasmussen


Dato : 10-08-04 17:49

On Tue, 10 Aug 2004 18:04:52 +0200, Michael U. Hove wrote:

> Kan ikke nok perl til at lave en kryptisk one-liner , men hvad med et
> godt gammelt sh-script ala:

Der er nu ikke så svært

Et lille eksempel:

% echo "Her er en lille hest der siger vov" > hest.txt
% cat hest.txt
Her er en lille hest der siger vov
% perl -pi -e 's/hest/hund/g' hest.txt
% cat hest.txt
Her er en lille hund der siger vov

Hvorvidt dette vil virke godt med xargs, skal jeg ikke sige, men eller kan
en:

for i in *.h; do perl -pi -e 's/BOOL/fBOOL/g' $i; done

også klare sagerne.

/Thomas



Michael U. Hove (10-08-2004)
Kommentar
Fra : Michael U. Hove


Dato : 10-08-04 17:58

Thomas Rasmussen wrote:

> for i in *.h; do perl -pi -e 's/BOOL/fBOOL/g' $i; done

Cool...nice at man ikke skal ud i de forbandede 'sed' temp filer, må
tjekke noget mere Perl ud !

/mvh
michael

--
"When you are not practicing, remember, someone, somewhere is
practicing, and when you meet him he will win."
Ed Macauley.

Thorbjoern Ravn Ande~ (10-08-2004)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 10-08-04 21:12

Thomas Rasmussen <thomas@p7.dk.invalid> writes:

> for i in *.h; do perl -pi -e 's/BOOL/fBOOL/g' $i; done

perl -pi -e 's/BOOL/fBOOL/g' *.h

(svjh).

--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk - Unix, Java, Web, Netværk, Århus

Peter Makholm (10-08-2004)
Kommentar
Fra : Peter Makholm


Dato : 10-08-04 18:08

"Michael U. Hove" <pots_72@e-mail.dk> writes:

> Cool...nice at man ikke skal ud i de forbandede 'sed' temp filer, må
> tjekke noget mere Perl ud !

Som sagt allerede så er der nogle sed-implementationer der også har et
tilsvarende -i flag.

GNU sed (i hvert fald 4.1.1) og FreeBSD's sed (siden 4.7) har begge
dette flag.

--
Peter Makholm | 'Cause suicide is painless
peter@makholm.net | It brings on many changes
http://hacking.dk | And I can take or leave it if I please
| -- Suicide is painless

Lasse Hillerøe Peter~ (10-08-2004)
Kommentar
Fra : Lasse Hillerøe Peter~


Dato : 10-08-04 17:56

In article <cfa1p0$2tnn$1@news.cybercity.dk>, thomas <thomas@momail.ik>
wrote:

> Hej
>
> er der en som kan vise mig hvordan man laver en search and replace med
> flere filer
>
> jeg er kommet så langt
>
> find -type f -name *.h | xargs sed -s 's/BOOL/fBOOL/g'

xargs er noget opreklameret bras.

Jeg forstår ikke hvorfor folk _altid_ glemmer at Bourne(Again)/Korn
shell er et ganske glimragende programmeringssprog.

find $dir -type f -name '*.h' | while read f ; do cp $f $f~ && sed
's/BOOL/fBOOL/g' <$f~ >$f ; done

Det er en oneliner hvis man kører 132 tegn/linie på sin VT220 (eller
hvis man bruger xterm på en ikke alt for lille skærm.)

For øvrigt skal '*.h' i anførselstegn (eller escapes med backslash),
fordi man vil give stjernen med som parameter til find, ikke have den
evalueret af shellen med det samme. Og find skal naturligvis også have
et dir at starte i. (Jeg ved heller ikke hvad den -s option til sed gør?
Er det noget GNU-textutils snask?)

Man _kunne_ også redigere inline, ved at erstatte sed kommandoen ovenfor
med:
(echo "1,$s/BOOL/fBOOL/g" ; echo "wq") | ex $f

Det er ikke kun i Perl TIMTOWTDI gælder.

(Og til Thorbjørn, for en sikkerheds skyld: Hvis du kommer med spydige
kommentarer om mange forks, Perls fortræffeligheder, eller risikoen for
mellemrum i filnavne, kommer du til at høre et *PLONK* så højt at du er
døv resten af ugen. )

-Lasse

Peter Makholm (10-08-2004)
Kommentar
Fra : Peter Makholm


Dato : 10-08-04 18:02

"Lasse Hillerøe Petersen" <lhp+news@toft-hp.dk> writes:

> find $dir -type f -name '*.h' | while read f ; do cp $f $f~ && sed
> 's/BOOL/fBOOL/g' <$f~ >$f ; done

Men det er længere og ikke bedre. (Og min xterm er 80 tegn bred)

'while read f ; do ... ; done' er altså længere end xargs uanset hvor
bred du laver din xterm.

--
Peter Makholm | 'Cause suicide is painless
peter@makholm.net | It brings on many changes
http://hacking.dk | And I can take or leave it if I please
| -- Suicide is painless

Kent Friis (10-08-2004)
Kommentar
Fra : Kent Friis


Dato : 10-08-04 18:07

Den Tue, 10 Aug 2004 18:56:11 +0200 skrev Lasse Hillerøe Petersen:
> In article <cfa1p0$2tnn$1@news.cybercity.dk>, thomas <thomas@momail.ik>
> wrote:
>
>> Hej
>>
>> er der en som kan vise mig hvordan man laver en search and replace med
>> flere filer
>>
>> jeg er kommet så langt
>>
>> find -type f -name *.h | xargs sed -s 's/BOOL/fBOOL/g'
>
> xargs er noget opreklameret bras.
>
> Jeg forstår ikke hvorfor folk _altid_ glemmer at Bourne(Again)/Korn
> shell er et ganske glimragende programmeringssprog.
>
> find $dir -type f -name '*.h' | while read f ; do cp $f $f~ && sed
> 's/BOOL/fBOOL/g' <$f~ >$f ; done

while-metoden bruger generelt mange flere PID'er / udfører mange
flere fork()'s, hvilket tager tid.

Det gør måske ingen forskel når man sidder og tester med 10 filer,
men med 10000 filer eller mere kan det betyde forskellen på om
scriptet tager sekunder (xargs) eller minutter (while read).

Mvh
Kent
--
Help test this great MMORPG game - http://www.eternal-lands.com/

Lasse Hillerøe Peter~ (10-08-2004)
Kommentar
Fra : Lasse Hillerøe Peter~


Dato : 10-08-04 20:31

In article <411900ba$0$73940$14726298@news.sunsite.dk>,
Kent Friis <nospam@nospam.invalid> wrote:

> Det gør måske ingen forskel når man sidder og tester med 10 filer,
> men med 10000 filer eller mere kan det betyde forskellen på om
> scriptet tager sekunder (xargs) eller minutter (while read).

Klart. (Det antydede jeg også i min kommentar til Thorbjørn.) Men i det
oprindelige eksempel med .h filer tror jeg ikke det betyder det store om
man skal vente 20 sekunder for lige at lave en rettelse i alle filer.

xargs har sin berettigelse, men man skal som med alt andet, vide hvornår
man skal bruge det, hvornår man ikke skal bruge det, og hvordan man skal
bruge det. Jeg betragter xargs som en optimering; noget man skal bruge
når den generelle måde at gøre tingene på er for langsom. Man skal som
bekendt ikke optimere for tidligt. Til gengæld har xargs nogle
begrænsninger. Det har den generelle metode ikke.

Der er for øvrigt en kendt gotcha med xargs grep; hvad kan der gå galt
her, som direkte konsekvens af xargs opførsel:

find $dir -type f | xargs grep pattern | sed 's/:.*//g' >matching_files

-Lasse

Kasper Dupont (10-08-2004)
Kommentar
Fra : Kasper Dupont


Dato : 10-08-04 20:57

Lasse Hillerøe Petersen wrote:
>
> Der er for øvrigt en kendt gotcha med xargs grep; hvad kan der gå galt
> her, som direkte konsekvens af xargs opførsel:
>
> find $dir -type f | xargs grep pattern | sed 's/:.*//g' >matching_files

Hvad kan gå galt udover at grep opfører sig anderledes
når den kun får et filnavn end hvis den får flere? Og
hvis det er det problem du tænker på, så synes jeg da
det er forkert at give xargs skylden for greps
inkonsistente opførsel.

I øvrigt burde dit eksempel være lavet med grep -l

Endnu en fordel ved xargs fremfor en while read løkke
er (hvis man ellers bruger gnu versionens -0 option),
at xargs kan håndtere alle mærkelige tegn i filnavnet
korrekt.

find $dir -type f -print0 | xargs -0 grep -l pattern --

--
Kasper Dupont -- der bruger for meget tid paa usenet.
Design #413859655
It's a computer monitor! It is great for hammering in nails!

Lasse Hillerøe Peter~ (10-08-2004)
Kommentar
Fra : Lasse Hillerøe Peter~


Dato : 10-08-04 22:21

In article <4119289E.99A6883D@nospam.lir.dk.invalid>,
Kasper Dupont <remove.invalid@nospam.lir.dk.invalid> wrote:

> Hvad kan gå galt udover at grep opfører sig anderledes
> når den kun får et filnavn end hvis den får flere? Og
> hvis det er det problem du tænker på, så synes jeg da
> det er forkert at give xargs skylden for greps
> inkonsistente opførsel.

Inkonsistent? Ud fra greps "synspunkt", kan man jo sige at når der er en
fil, ved man vel hvilken, og så er filnavnet overflødigt. Sådan er grep
jo nu engang. Mange Unix utilities er inkonsistente på en eller anden
måde.

Men problemet er xargs, fordi det er overladt til xargs at dele filerne
op. Visse xargs implementationer gør da også noget for at undgå dette,
har jeg hørt. (NetBSDs gør ikke. Så ved n*5000+1 filer har man
problemet. Tit nok til at være et problem, men sjældent nok til at man
måske ikke opdager det før man er blevet bidt af det.)

xargs er jo egentlig blot en kludge fordi der er en grænse for hvor lang
en kommandolinie kan være. Kunne man bruge CMD $(...) i stedet for
....|xargs CMD i alle situationer, ville problemet kun opstå når der kun
er en fil, i stedet for ved n*K+1 filer, hvor n kan være hvad som helst,
og K er en forholdsvis stor konstant defineret af (en "naiv") xargs.

> I øvrigt burde dit eksempel være lavet med grep -l
[osv]

Jajada.

-Lasse

Kent Friis (10-08-2004)
Kommentar
Fra : Kent Friis


Dato : 10-08-04 22:02

Den Tue, 10 Aug 2004 21:31:01 +0200 skrev Lasse Hillerøe Petersen:
> In article <411900ba$0$73940$14726298@news.sunsite.dk>,
> Kent Friis <nospam@nospam.invalid> wrote:
>
>> Det gør måske ingen forskel når man sidder og tester med 10 filer,
>> men med 10000 filer eller mere kan det betyde forskellen på om
>> scriptet tager sekunder (xargs) eller minutter (while read).
>
> Klart. (Det antydede jeg også i min kommentar til Thorbjørn.) Men i det
> oprindelige eksempel med .h filer tror jeg ikke det betyder det store om
> man skal vente 20 sekunder for lige at lave en rettelse i alle filer.
>
> xargs har sin berettigelse, men man skal som med alt andet, vide hvornår
> man skal bruge det, hvornår man ikke skal bruge det, og hvordan man skal
> bruge det. Jeg betragter xargs som en optimering; noget man skal bruge
> når den generelle måde at gøre tingene på er for langsom.

xargs er ofte det hurtigste at skrive, og klart det nemmeste. Og den
er skam generel, bare man lige husker -0 og find -print0.

> Man skal som
> bekendt ikke optimere for tidligt. Til gengæld har xargs nogle
> begrænsninger.

Hvilke begrænsninger?

> Der er for øvrigt en kendt gotcha med xargs grep; hvad kan der gå galt
> her, som direkte konsekvens af xargs opførsel:
>
> find $dir -type f | xargs grep pattern | sed 's/:.*//g' >matching_files

Hvad brokker du dig over? At hvis du ikke beder grep give dig filnavnet,
så giver den dig ikke nødvendigvis filnavnet. Alle kommandoer kan give
et uønsket resultat, hvis man beder om det.

Mvh
Kent
--
Help test this great MMORPG game - http://www.eternal-lands.com/

Lasse Hillerøe Peter~ (10-08-2004)
Kommentar
Fra : Lasse Hillerøe Peter~


Dato : 10-08-04 22:32

In article <411937bb$0$73944$14726298@news.sunsite.dk>,
Kent Friis <nospam@nospam.invalid> wrote:

> xargs er ofte det hurtigste at skrive, og klart det nemmeste. Og den
> er skam generel, bare man lige husker -0 og find -print0.

Med generel mener jeg at i "...|while read f ; do F $f ; done" kan
funktionen F være hvad som helst. I "...|xargs C" kan C kun være en
simpel kommando der tager et antal filnavne som sidste argumenter.

-Lasse

Kent Friis (11-08-2004)
Kommentar
Fra : Kent Friis


Dato : 11-08-04 16:08

Den Tue, 10 Aug 2004 23:32:06 +0200 skrev Lasse Hillerøe Petersen:
> In article <411937bb$0$73944$14726298@news.sunsite.dk>,
> Kent Friis <nospam@nospam.invalid> wrote:
>
>> xargs er ofte det hurtigste at skrive, og klart det nemmeste. Og den
>> er skam generel, bare man lige husker -0 og find -print0.
>
> Med generel mener jeg at i "...|while read f ; do F $f ; done" kan
> funktionen F være hvad som helst. I "...|xargs C" kan C kun være en
> simpel kommando der tager et antal filnavne som sidste argumenter.

man xargs

xargs -i cp {} /tmp

Mvh
Kent
--
Help test this great MMORPG game - http://www.eternal-lands.com/

Lasse Hillerøe Peter~ (11-08-2004)
Kommentar
Fra : Lasse Hillerøe Peter~


Dato : 11-08-04 18:29

In article <411a363f$0$73938$14726298@news.sunsite.dk>,
Kent Friis <nospam@nospam.invalid> wrote:

> man xargs
>
> xargs -i cp {} /tmp

Ja, cp er en simpel kommando der tager et antal filnavne som sidste
argumenter. At xargs på Linux kan putte et ekstra filnavn bagefter gør
ingen forskel. Det er i øvrigt ikke standard iflg POSIX (se
<http://www.opengroup.org/onlinepubs/000095399/utilities/xargs.html>) og
findes ikke i NetBSD xargs. *Ikke portabelt* med andre ord.

-Lasse

Kent Friis (11-08-2004)
Kommentar
Fra : Kent Friis


Dato : 11-08-04 19:23

Den Wed, 11 Aug 2004 19:29:00 +0200 skrev Lasse Hillerøe Petersen:
> In article <411a363f$0$73938$14726298@news.sunsite.dk>,
> Kent Friis <nospam@nospam.invalid> wrote:
>
>> man xargs
>>
>> xargs -i cp {} /tmp
>
> Ja, cp er en simpel kommando der tager et antal filnavne som sidste
> argumenter.

At det sidste argument er et filnavn er kun fordi jeg ikke lige kunne
finde nogen kommandoer der skal have et ikke-filnavn efter filnavnet.

> At xargs på Linux kan putte et ekstra filnavn bagefter gør
> ingen forskel. Det er i øvrigt ikke standard iflg POSIX (se
> <http://www.opengroup.org/onlinepubs/000095399/utilities/xargs.html>) og
> findes ikke i NetBSD xargs. *Ikke portabelt* med andre ord.

Til gengæld er gnu xargs portabel til de fleste systemer - selv systemer
som ikke har xargs i forvejen (vha cygwin).

Mvh
Kent
--
Help test this great MMORPG game - http://www.eternal-lands.com/

Thorbjoern Ravn Ande~ (11-08-2004)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 11-08-04 19:36

"Lasse Hillerøe Petersen" <lhp+news@toft-hp.dk> writes:

> *Ikke portabelt* med andre ord.

Er du stadig helt sikker på at jeg ikke må sige et kvæk om Perl?
--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk - Unix, Java, Web, Netværk, Århus

Lasse Hillerøe Peter~ (11-08-2004)
Kommentar
Fra : Lasse Hillerøe Peter~


Dato : 11-08-04 20:27

In article <yu2brhh34lb.fsf@luhmann.netc.dk>,
Thorbjoern Ravn Andersen <nospam0000@c.dk> wrote:

> "Lasse Hillerøe Petersen" <lhp+news@toft-hp.dk> writes:
>
> > *Ikke portabelt* med andre ord.
>
> Er du stadig helt sikker på at jeg ikke må sige et kvæk om Perl?

Jeg har vist sagt min pointe i denne tråd: xargs kommandoen kan ikke
erstatte generaliteten ved at anvende egentlige programkonstruktioner (i
dette tilfælde while-do-done). Det er et trivielt faktum at Perl
tilbyder disse konstruktioner uden nødvendigvis at anvende hele
programmer som primitiver, og derved opnår det bedste af alle verdener.
Som bekendt er Perl jo en slags fusion af shell, awk, sed osv.

Korn Shell (ksh93) gør det muligt at lave nye built-in kommandoer med
shared libraries. På den måde ville det også være muligt at lave
programmer der ikke belastes af fork-exec, uden at miste generalitet.
Men stadig: det er optimering.

Slå dig løs hvis du har noget at tilføje.

-Lasse

Kent Friis (11-08-2004)
Kommentar
Fra : Kent Friis


Dato : 11-08-04 20:54

Den Wed, 11 Aug 2004 21:26:46 +0200 skrev Lasse Hillerøe Petersen:
> In article <yu2brhh34lb.fsf@luhmann.netc.dk>,
> Thorbjoern Ravn Andersen <nospam0000@c.dk> wrote:
>
>> "Lasse Hillerøe Petersen" <lhp+news@toft-hp.dk> writes:
>>
>> > *Ikke portabelt* med andre ord.
>>
>> Er du stadig helt sikker på at jeg ikke må sige et kvæk om Perl?
>
> Jeg har vist sagt min pointe i denne tråd: xargs kommandoen kan ikke
> erstatte generaliteten ved at anvende egentlige programkonstruktioner (i
> dette tilfælde while-do-done).

Og det er svært at få while-do-done til at erstatte xargs. Prøv fx at
omskrive flg. til at bruge while:

ls | grep "\.jpe*g$" | xargs xv

Mvh
Kent
--
Help test this great MMORPG game - http://www.eternal-lands.com/

Klaus Ellegaard (11-08-2004)
Kommentar
Fra : Klaus Ellegaard


Dato : 11-08-04 21:07

Kent Friis <nospam@nospam.invalid> writes:

>Og det er svært at få while-do-done til at erstatte xargs. Prøv fx at
>omskrive flg. til at bruge while:

>ls | grep "\.jpe*g$" | xargs xv

Det kommer jo igen an på formålet. Ovenstående er en udmærket
opgave til xargs. Men prøv at lave en xargs-konstruktion, der
viser billederne i rækkefølge, men bruger "ee" til lige numre
og xv til ulige numre *hvis* EXIF-informationen siger, at der
højst er 1000 pixels vandret.

Løsningerne er altså ikke enten-eller. Men generelt har xargs
en meget begrænset funktionalitet, medmindre man går på kompromis
med portabiliteten.

Mvh.
   Klaus.

Kent Friis (11-08-2004)
Kommentar
Fra : Kent Friis


Dato : 11-08-04 21:14

Den Wed, 11 Aug 2004 20:07:22 +0000 (UTC) skrev Klaus Ellegaard:
> Kent Friis <nospam@nospam.invalid> writes:
>
>>Og det er svært at få while-do-done til at erstatte xargs. Prøv fx at
>>omskrive flg. til at bruge while:
>
>>ls | grep "\.jpe*g$" | xargs xv
>
> Det kommer jo igen an på formålet. Ovenstående er en udmærket
> opgave til xargs.

Formålet er at kunne bruge next/prev knapperne...

> Men prøv at lave en xargs-konstruktion, der
> viser billederne i rækkefølge, men bruger "ee" til lige numre
> og xv til ulige numre *hvis* EXIF-informationen siger, at der
> højst er 1000 pixels vandret.

Hvad med noget der giver mening?

> Løsningerne er altså ikke enten-eller. Men generelt har xargs
> en meget begrænset funktionalitet, medmindre man går på kompromis
> med portabiliteten.

Den kan det den er lavet til. Hvis du ikke vil have begrænset
funktionalitet, så er Emacs nok løsningen (og dog, mangler den
ikke stadig at kunne svejse under vand?)

Mvh
Kent
--
Help test this great MMORPG game - http://www.eternal-lands.com/

Klaus Ellegaard (11-08-2004)
Kommentar
Fra : Klaus Ellegaard


Dato : 11-08-04 21:19

Kent Friis <nospam@nospam.invalid> writes:

>>>ls | grep "\.jpe*g$" | xargs xv
>>
>> Det kommer jo igen an på formålet. Ovenstående er en udmærket
>> opgave til xargs.

>Formålet er at kunne bruge next/prev knapperne...

Tjah... jeg ville jo nok spare lidt ekstra ved at...

xv `ls | grep "\.jpe*g$"`

>Den kan det den er lavet til. Hvis du ikke vil have begrænset
>funktionalitet, så er Emacs nok løsningen (og dog, mangler den
>ikke stadig at kunne svejse under vand?)

Så er vist lidt ude af proportioner i forhold til shell-scripting?
Om noget er næste skridt jo nok awk eller perl, hvis man også skal
tænke i resurseforbrug.

Mvh.
   Klaus.

Kent Friis (11-08-2004)
Kommentar
Fra : Kent Friis


Dato : 11-08-04 21:28

Den Wed, 11 Aug 2004 20:18:56 +0000 (UTC) skrev Klaus Ellegaard:
> Kent Friis <nospam@nospam.invalid> writes:
>
>>>>ls | grep "\.jpe*g$" | xargs xv
>>>
>>> Det kommer jo igen an på formålet. Ovenstående er en udmærket
>>> opgave til xargs.
>
>>Formålet er at kunne bruge next/prev knapperne...
>
> Tjah... jeg ville jo nok spare lidt ekstra ved at...
>
> xv `ls | grep "\.jpe*g$"`

Det gjorde jeg også dengang min billedsamling ikke var ret stor.

>>Den kan det den er lavet til. Hvis du ikke vil have begrænset
>>funktionalitet, så er Emacs nok løsningen (og dog, mangler den
>>ikke stadig at kunne svejse under vand?)
>
> Så er vist lidt ude af proportioner i forhold til shell-scripting?

Det var dig der klagede over at xargs har begrænset funktionalitet. IMHO
er det en god ting at funktionaliteten er begrænset til det programmet
er beregnet til.

Ligesom en editor der er begrænset til at rette i filer, og ikke tror
den er doktor.

Mvh
Kent
--
Help test this great MMORPG game - http://www.eternal-lands.com/

Klaus Ellegaard (11-08-2004)
Kommentar
Fra : Klaus Ellegaard


Dato : 11-08-04 21:30

Kent Friis <nospam@nospam.invalid> writes:

>> Så er vist lidt ude af proportioner i forhold til shell-scripting?

>Det var dig der klagede over at xargs har begrænset funktionalitet.

....sammenlignet med while-løkken. Ikke andet.

Mvh.
   Klaus.

Kent Friis (11-08-2004)
Kommentar
Fra : Kent Friis


Dato : 11-08-04 21:32

Den Wed, 11 Aug 2004 20:29:44 +0000 (UTC) skrev Klaus Ellegaard:
> Kent Friis <nospam@nospam.invalid> writes:
>
>>> Så er vist lidt ude af proportioner i forhold til shell-scripting?
>
>>Det var dig der klagede over at xargs har begrænset funktionalitet.
>
> ...sammenlignet med while-løkken. Ikke andet.

while-løkken har jo også begrænset funktionalitet sammenlignet med
xargs.

xargs kan ikke det while-løkken er beregnet til, og while-løkken kan
ikke det xargs er beregnet til.

Jeg har i hvert fald endnu ikke set xv-eksemplet omskrevet til at
bruge while.

Mvh
Kent
--
Help test this great MMORPG game - http://www.eternal-lands.com/

Lasse Hillerøe Peter~ (12-08-2004)
Kommentar
Fra : Lasse Hillerøe Peter~


Dato : 12-08-04 07:12

In article <411a8241$0$73943$14726298@news.sunsite.dk>,
Kent Friis <nospam@nospam.invalid> wrote:

> xargs kan ikke det while-løkken er beregnet til, og while-løkken kan
> ikke det xargs er beregnet til.
>
> Jeg har i hvert fald endnu ikke set xv-eksemplet omskrevet til at
> bruge while.

Jamen dog, du vil gerne have det skåret ud i pap.
ls | grep "\.jpe*g$"|while read f ; do xv $f ; done

Eneste forskel er, at din xargs løsning (på NetBSD, givet 10001 filer)
kalder xv tre gange med hhv 5000, 5000, og 1 fil som argument, mens
while-løkken er mere entydig og hver gang kalder med 1 fil som argument.
Jeg ved ikke hvordan din metode virker på Linux. Men jeg ved at min
virker på nøjagtig samme måde alle steder. Inden du kritiserer at min
løsning ikke tillader brug af next/prev, så lad mig gentage fra mit
andet svar her til morgen: din xargs løsning virker jo alligevel ikke
korrekt. (Hvilket har været min gennemgående pointe i denne tråd: xargs
er en optimering med begrænset anvendelsesområde, og den skal bruges med
forsigtighed, for man kan - som du demonstrerede - let lave et program
der tilsyneladende virker, men under visse, forholdsvis sjældne
omstændigheder fejler. Den slags fejl er som bekendt den værste slags.)

-Lasse
(Som nu i ca et år har læst mail med cd Maildir/new; ls|while read f ;
do echo $f ; grep ^From: $f|head -1 ; grep ^Subject: $f|head -1 ; read r
</dev/tty ; if [[ $r == "r" ]] ; then more $f ; fi ; done, eller diverse
variationer heraf.)

Thomas S. Iversen (12-08-2004)
Kommentar
Fra : Thomas S. Iversen


Dato : 12-08-04 09:46

In article <lhp+news-38D07A.08113912082004@news.tele.dk>, Lasse Hillerøe Petersen wrote:
> (Som nu i ca et år har læst mail med cd Maildir/new; ls|while read f ;
> do echo $f ; grep ^From: $f|head -1 ; grep ^Subject: $f|head -1 ; read r
></dev/tty ; if [[ $r == "r" ]] ; then more $f ; fi ; done, eller diverse
> variationer heraf.)

Ikke fordi jeg vil udsætte noget på din måde at læse mail på, men kan du
give mit et clue til, _hvorfor_ du gør det på den måde?

Thomas (der også har set en c64 demo programmør skrive "assemblerkode"
som en lang streng af: 0xFE, 0x65, 0x21, 0x30, osv --- ingen symbolske hjælpemidler, overhovedet. Han kunne endda holde styr på både
relative og absolutte hops i koden med de rigtige hexværdier som
"argument" til de rigtige hexværdier for opcodes. Hvor vildt det end var
har jeg endnu til gode at regne ud _hvorfor_ han valgte den løsning

Lasse Hillerøe Peter~ (12-08-2004)
Kommentar
Fra : Lasse Hillerøe Peter~


Dato : 12-08-04 10:36

In article <slrnchmbho.n43.thomassi@dirac.dina.kvl.dk>,
"Thomas S. Iversen" <thomassi@dirac.dina.kvl.dk> wrote:

> Ikke fordi jeg vil udsætte noget på din måde at læse mail på, men kan du
> give mit et clue til, _hvorfor_ du gør det på den måde?

Af samme grund som jeg gør så meget andet tosset. Måske er jeg i godt
humør, måske er jeg en smule skør.

-Lasse

Thorbjoern Ravn Ande~ (12-08-2004)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 12-08-04 12:58

"Lasse Hillerøe Petersen" <lhp+news@toft-hp.dk> writes:

> > Ikke fordi jeg vil udsætte noget på din måde at læse mail på, men kan du
> > give mit et clue til, _hvorfor_ du gør det på den måde?
>
> Af samme grund som jeg gør så meget andet tosset. Måske er jeg i godt
> humør, måske er jeg en smule skør.

Jeg troede det var fordi du ville være HELT siker på ikke at åbne en
ond spammers "ja der er nogen på denne mailadresse"-giffer.

Hvad gør du iøvrigt for at bladre tilbage i et foregående indlæg, hvis
der var noget du ville se igen?
--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk - Unix, Java, Web, Netværk, Århus

Thorbjoern Ravn Ande~ (12-08-2004)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 12-08-04 12:57

"Thomas S. Iversen" <thomassi@dirac.dina.kvl.dk> writes:

> Thomas (der også har set en c64 demo programmør skrive "assemblerkode"
> som en lang streng af: 0xFE, 0x65, 0x21, 0x30, osv --- ingen symbolske hjælpemidler, overhovedet. Han kunne endda holde styr på både
> relative og absolutte hops i koden med de rigtige hexværdier som
> "argument" til de rigtige hexværdier for opcodes. Hvor vildt det end var
> har jeg endnu til gode at regne ud _hvorfor_ han valgte den løsning

Hvad skulle man ellers have brugt?

(Gerne konkrete produkter :)
--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk - Unix, Java, Web, Netværk, Århus

Thomas S. Iversen (12-08-2004)
Kommentar
Fra : Thomas S. Iversen


Dato : 12-08-04 13:14

On 2004-08-12, Thorbjoern Ravn Andersen <nospam0000@c.dk> wrote:
> "Thomas S. Iversen" <thomassi@dirac.dina.kvl.dk> writes:
>
>> Thomas (der også har set en c64 demo programmør skrive "assemblerkode"
>> som en lang streng af: 0xFE, 0x65, 0x21, 0x30, osv --- ingen symbolske hjælpemidler, overhovedet. Han kunne endda holde styr på både
>> relative og absolutte hops i koden med de rigtige hexværdier som
>> "argument" til de rigtige hexværdier for opcodes. Hvor vildt det end var
>> har jeg endnu til gode at regne ud _hvorfor_ han valgte den løsning
>
> Hvad skulle man ellers have brugt?

Han kunne have brugt en makro assembler lige som alle os andre. Eller evt.
da bare den indbyggede ram debugger der fandtes i hvert eneste
udvidelsescartridge.

Men nej, det var noget i stil med:

10 for i = 1 ... n
20 poke startadress+i=data[i];
30 data={0x11, 0x22, 0x32, 0x01, osv, osv}

Syret siger jeg bare.

> (Gerne konkrete produkter :)

Jeg kan skisme ikke lige huske de præcise navne på de assemblere vi brugte

Thomas

Kent Friis (12-08-2004)
Kommentar
Fra : Kent Friis


Dato : 12-08-04 20:04

Den 12 Aug 2004 12:14:17 GMT skrev Thomas S. Iversen:
> On 2004-08-12, Thorbjoern Ravn Andersen <nospam0000@c.dk> wrote:
>> "Thomas S. Iversen" <thomassi@dirac.dina.kvl.dk> writes:
>>
>>> Thomas (der også har set en c64 demo programmør skrive "assemblerkode"
>>> som en lang streng af: 0xFE, 0x65, 0x21, 0x30, osv --- ingen symbolske hjælpemidler, overhovedet. Han kunne endda holde styr på både
>>> relative og absolutte hops i koden med de rigtige hexværdier som
>>> "argument" til de rigtige hexværdier for opcodes. Hvor vildt det end var
>>> har jeg endnu til gode at regne ud _hvorfor_ han valgte den løsning
>>
>> Hvad skulle man ellers have brugt?
>
> Han kunne have brugt en makro assembler lige som alle os andre. Eller evt.
> da bare den indbyggede ram debugger der fandtes i hvert eneste
> udvidelsescartridge.

Jeg har villet have fat i en makro-assembler i mange år (dengang), men
det lykkedes aldrig. Så jeg måtte klare mig med:

> Men nej, det var noget i stil med:
>
> 10 for i = 1 ... n
> 20 poke startadress+i=data[i];
> 30 data={0x11, 0x22, 0x32, 0x01, osv, osv}

10 A=49152
20 READ B
30 IF B<0 THEN SYS 49152
40 POKE A,B
50 A=A+1
60 GOTO 20
70 DATA 169,0,141,32,208,169,7,141,32,203,76,0,192,-1

(untested, jeg har fået nuket min vice installation, og jeg gider ikke
til at gå over og tænde 64'eren).

Det var BASIC, og den kendte ikke noget til hex-tal.

Jeg fik dog på et tidspunkt fat i en linie-assembler, altså sådan en
hvor man kan rette en linie ad gangen - og hvis man skal putte en
ekstra instruktion ind, går man igang med M C03A C2FF C03D.

Mvh
Kent
--
Help test this great MMORPG game - http://www.eternal-lands.com/

Thomas S. Iversen (12-08-2004)
Kommentar
Fra : Thomas S. Iversen


Dato : 12-08-04 22:24

On 2004-08-12, Kent Friis <nospam@nospam.invalid> wrote:

> 10 A=49152
> 20 READ B
> 30 IF B<0 THEN SYS 49152
> 40 POKE A,B
> 50 A=A+1
> 60 GOTO 20
> 70 DATA 169,0,141,32,208,169,7,141,32,203,76,0,192,-1
>
> (untested, jeg har fået nuket min vice installation, og jeg gider ikke
> til at gå over og tænde 64'eren).

KENT er det dig? Nej serioest saa er I altsaa flere der programmerede
demoer paa den maade. Tja. Livet er fuld af overraskelser.

> Det var BASIC, og den kendte ikke noget til hex-tal.

Nej selvfoelgelig ikke. My bad.

> Jeg fik dog på et tidspunkt fat i en linie-assembler, altså sådan en
> hvor man kan rette en linie ad gangen - og hvis man skal putte en
> ekstra instruktion ind, går man igang med M C03A C2FF C03D.

Jeps. Det var ulempen ved en linie assembler. Jeg har desvaerre laant mine
disketter ud til en anden, men ellers kunne du da godt, saadan 15 aar for
sent, faa en kopi af min makro assembler

Thomas

Kent Friis (12-08-2004)
Kommentar
Fra : Kent Friis


Dato : 12-08-04 19:55

Den Thu, 12 Aug 2004 08:11:39 +0200 skrev Lasse Hillerøe Petersen:
> In article <411a8241$0$73943$14726298@news.sunsite.dk>,
> Kent Friis <nospam@nospam.invalid> wrote:
>
>> xargs kan ikke det while-løkken er beregnet til, og while-løkken kan
>> ikke det xargs er beregnet til.
>>
>> Jeg har i hvert fald endnu ikke set xv-eksemplet omskrevet til at
>> bruge while.
>
> Jamen dog, du vil gerne have det skåret ud i pap.
> ls | grep "\.jpe*g$"|while read f ; do xv $f ; done
>
> Eneste forskel er, at din xargs løsning (på NetBSD, givet 10001 filer)
> kalder xv tre gange med hhv 5000, 5000, og 1 fil som argument, mens
> while-løkken er mere entydig og hver gang kalder med 1 fil som argument.

Eneste forskel er at den virker ikke efter formålet, da det ikke er
muligt at skifte frem og tilbage mellem billederne for at sammenligne
billederne.

> Jeg ved ikke hvordan din metode virker på Linux. Men jeg ved at min
> virker på nøjagtig samme måde alle steder. Inden du kritiserer at min
> løsning ikke tillader brug af next/prev, så lad mig gentage fra mit
> andet svar her til morgen: din xargs løsning virker jo alligevel ikke
> korrekt.

I modsætning til dit forslag, så virker den efter formålet. Hvordan
du så definerer "virker korrekt" ved jeg ikke.

Mvh
Kent
--
Help test this great MMORPG game - http://www.eternal-lands.com/

Lasse Hillerøe Peter~ (12-08-2004)
Kommentar
Fra : Lasse Hillerøe Peter~


Dato : 12-08-04 20:25

In article <411bbd0d$0$73938$14726298@news.sunsite.dk>,
Kent Friis <nospam@nospam.invalid> wrote:

> I modsætning til dit forslag, så virker den efter formålet. Hvordan
> du så definerer "virker korrekt" ved jeg ikke.

Man kan ikke diskutere med en person der ikke ved hvad "virker korrekt"
betyder. Slut herfra.

-Lasse

Kent Friis (12-08-2004)
Kommentar
Fra : Kent Friis


Dato : 12-08-04 20:44

Den Thu, 12 Aug 2004 21:25:03 +0200 skrev Lasse Hillerøe Petersen:
> In article <411bbd0d$0$73938$14726298@news.sunsite.dk>,
> Kent Friis <nospam@nospam.invalid> wrote:
>
>> I modsætning til dit forslag, så virker den efter formålet. Hvordan
>> du så definerer "virker korrekt" ved jeg ikke.
>
> Man kan ikke diskutere med en person der ikke ved hvad "virker korrekt"
> betyder. Slut herfra.

I min verden inkluderer "virker korrekt" at tingene virker efter
formålet. Og det gør min løsning, men din gør ikke.

Altså må du bruge en anden definition, og den er jeg interesseret i
at høre.

Mvh
Kent
--
Help test this great MMORPG game - http://www.eternal-lands.com/

Thorbjoern Ravn Ande~ (11-08-2004)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 11-08-04 22:50

Kent Friis <nospam@nospam.invalid> writes:

> Ligesom en editor der er begrænset til at rette i filer, og ikke tror
> den er doktor.

Hov hov.

"emacs -f doctor".
--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk - Unix, Java, Web, Netværk, Århus

Peter Dalgaard (11-08-2004)
Kommentar
Fra : Peter Dalgaard


Dato : 11-08-04 23:42

Thorbjoern Ravn Andersen <nospam0000@c.dk> writes:

> Kent Friis <nospam@nospam.invalid> writes:
>
> > Ligesom en editor der er begrænset til at rette i filer, og ikke tror
> > den er doktor.
>
> Hov hov.
>
> "emacs -f doctor".

"emacs -f psychoanalyze-pinhead" (tast C-g)

Is it because of your sex life that you say were these parsnips
correctly marinated in taco sauce?

--
O__ ---- Peter Dalgaard Blegdamsvej 3
c/ /'_ --- Dept. of Biostatistics 2200 Cph. N
(*) \(*) -- University of Copenhagen Denmark Ph: (+45) 35327918
~~~~~~~~~~ - (p.dalgaard@biostat.ku.dk) FAX: (+45) 35327907

Kent Friis (12-08-2004)
Kommentar
Fra : Kent Friis


Dato : 12-08-04 20:06

Den 11 Aug 2004 23:49:31 +0200 skrev Thorbjoern Ravn Andersen:
> Kent Friis <nospam@nospam.invalid> writes:
>
>> Ligesom en editor der er begrænset til at rette i filer, og ikke tror
>> den er doktor.
>
> Hov hov.
>
> "emacs -f doctor".

Hehehehe :-þ

Mvh
Kent
--
Help test this great MMORPG game - http://www.eternal-lands.com/

Lasse Hillerøe Peter~ (12-08-2004)
Kommentar
Fra : Lasse Hillerøe Peter~


Dato : 12-08-04 07:11

In article <411a7e1e$0$73950$14726298@news.sunsite.dk>,
Kent Friis <nospam@nospam.invalid> wrote:

> Den Wed, 11 Aug 2004 20:07:22 +0000 (UTC) skrev Klaus Ellegaard:
> > Kent Friis <nospam@nospam.invalid> writes:
> >
> >>Og det er svært at få while-do-done til at erstatte xargs. Prøv fx at
> >>omskrive flg. til at bruge while:
> >
> >>ls | grep "\.jpe*g$" | xargs xv
> >
> > Det kommer jo igen an på formålet. Ovenstående er en udmærket
> > opgave til xargs.
>
> Formålet er at kunne bruge next/prev knapperne...

Ja din xargs løsning virker jo i så fald alligevel ikke korrekt, hvis
antallet af filer overstiger antallet af filer xargs overfører til en
kommando. Med mindre xv da skulle have en named pipe, så efterfølgende
invokationer af xv blot sender listen af filargumenter til den kørende.
Så kunne man lige så godt ha lavet xv så den tager filerne fra stdin
(eller bare selv sende output fra ls til fifoen) og skippe xargs helt.

Hvis antallet ikke er større end at din løsning virker korrekt, så virker
xv `ls | grep "\.jpe*g$"` også korrekt. Det ville nok være
hensigtsmæssigt at dele sine billeder op i directories, så dette er
tilfældet.

> > Men prøv at lave en xargs-konstruktion, der
> > viser billederne i rækkefølge, men bruger "ee" til lige numre
> > og xv til ulige numre *hvis* EXIF-informationen siger, at der
> > højst er 1000 pixels vandret.
>
> Hvad med noget der giver mening?

Som eksempel gav det ganske god mening. Mindst lige så god som dit
xv-eksempel, hvor du nydeligt demonstrerede at xargs ikke altid løser et
problem, men bare camouflerer det.

> Den kan det den er lavet til.

Det er rigtigt. Den er lavet som en ikke-generel, men optimeret
kludge-løsning til det grundlæggende problem: en arbitrær begrænsning af
kommandoliniens størrelse.

-Lasse

Thorbjoern Ravn Ande~ (12-08-2004)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 12-08-04 08:31

"Lasse Hillerøe Petersen" <lhp+news@toft-hp.dk> writes:

> kommandoliniens størrelse.

Kunne man med en vis rimelighed i vore dage ikke forvente at denne var
_MEGET_ stor?
--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk - Unix, Java, Web, Netværk, Århus

Lasse Hillerøe Peter~ (12-08-2004)
Kommentar
Fra : Lasse Hillerøe Peter~


Dato : 12-08-04 10:26

In article <yu2r7qc7qz0.fsf@luhmann.netc.dk>,
Thorbjoern Ravn Andersen <nospam0000@c.dk> wrote:

> "Lasse Hillerøe Petersen" <lhp+news@toft-hp.dk> writes:
>
> > kommandoliniens størrelse.
>
> Kunne man med en vis rimelighed i vore dage ikke forvente at denne var
> _MEGET_ stor?

Jo, men selv _MEGET_ stor er ikke altid stor nok.
dog $ sysctl kern.argmax
kern.argmax = 262144

(Jeg ved ikke hvad det er på andre systemer. GNU configure er en kvart
evighed om at checke det på NetBSD, og giver så vist alligevel op og
antager en forkert og for lav værdi.)

Med argumentet foo0000 (8 byte incl termineringsnul) giver det ca 32768
filer, eller mere præcis (afhængig af kommandoen, der jo er argv[0]):

dog $ for i in $(jot 2 32719) ; do echo $i ; /bin/echo `jot -b
"foo0000" $i`>/dev/null ; done
32719
32720
ksh: /bin/echo: Argument list too long

Så i xv-eksemplet ville den "naive" løsning xv `ls ...` give det ønskede
resultat så længe der var færre end 32K filer (med navne på 7 tegn),
mens ls ...| xargs xv ville give uønskede afbræk for hver 5000 filer på
NetBSD, med mindre man vidste man skulle bruge xargs -n 32000 xv.

I mine maildirs har hver mail et navn på ca 32 tegn. Dvs et Maildir med
ca 8K mails kan give problemer. Ikke almindeligt, men absolut muligt. Og
med en find tilstrækkeligt højt oppe fra vil man nok let risikere mange
lange stinavne.

Men helt generelt så vil jeg mene C `G` er at foretrække frem for
G|xargs C, så længe G|wc -c er tilstrækkeligt mindre end argmax. Det
sparer jo også en fork eller to.

-Lasse

Kent Friis (12-08-2004)
Kommentar
Fra : Kent Friis


Dato : 12-08-04 20:10

Den Thu, 12 Aug 2004 08:11:11 +0200 skrev Lasse Hillerøe Petersen:
> In article <411a7e1e$0$73950$14726298@news.sunsite.dk>,
> Kent Friis <nospam@nospam.invalid> wrote:
>
>> Den Wed, 11 Aug 2004 20:07:22 +0000 (UTC) skrev Klaus Ellegaard:
>> > Kent Friis <nospam@nospam.invalid> writes:
>> >
>> >>Og det er svært at få while-do-done til at erstatte xargs. Prøv fx at
>> >>omskrive flg. til at bruge while:
>> >
>> >>ls | grep "\.jpe*g$" | xargs xv
>> >
>> > Det kommer jo igen an på formålet. Ovenstående er en udmærket
>> > opgave til xargs.
>>
>> Formålet er at kunne bruge next/prev knapperne...
>
> Ja din xargs løsning virker jo i så fald alligevel ikke korrekt, hvis
> antallet af filer overstiger antallet af filer xargs overfører til en
> kommando.

Nu var det med det formål at sammenligne billederne - og jeg kan
alligevel ikke overskue fx 12000 billeder ad gangen.

> Hvis antallet ikke er større end at din løsning virker korrekt, så virker
> xv `ls | grep "\.jpe*g$"` også korrekt. Det ville nok være
> hensigtsmæssigt at dele sine billeder op i directories, så dette er
> tilfældet.

Det er de skam blevet, men så begynder man jo at bruge find i stedet
for ls

>> > Men prøv at lave en xargs-konstruktion, der
>> > viser billederne i rækkefølge, men bruger "ee" til lige numre
>> > og xv til ulige numre *hvis* EXIF-informationen siger, at der
>> > højst er 1000 pixels vandret.
>>
>> Hvad med noget der giver mening?
>
> Som eksempel gav det ganske god mening. Mindst lige så god som dit
> xv-eksempel, hvor du nydeligt demonstrerede at xargs ikke altid løser et
> problem, men bare camouflerer det.

Mit var et real-world eksempel, som xargs løste perfekt.

>> Den kan det den er lavet til.
>
> Det er rigtigt. Den er lavet som en ikke-generel, men optimeret
> kludge-løsning til det grundlæggende problem: en arbitrær begrænsning af
> kommandoliniens størrelse.

Hvis du mener det er et problem, hvorfor skifter du så ikke til et OS
hvor man ikke har den begrænsning?

Mvh
Kent
--
Help test this great MMORPG game - http://www.eternal-lands.com/

Thorbjoern Ravn Ande~ (11-08-2004)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 11-08-04 20:59

"Lasse Hillerøe Petersen" <lhp+news@toft-hp.dk> writes:

> Korn Shell (ksh93) gør det muligt at lave nye built-in kommandoer med
> shared libraries. På den måde ville det også være muligt at lave
> programmer der ikke belastes af fork-exec, uden at miste generalitet.
> Men stadig: det er optimering.
>
> Slå dig løs hvis du har noget at tilføje.

Jeg bøjer mig skam i støvet for din viden om hvad der er muligt i
diverse shells. Jeg har selv resigneret for længe siden, og begrænset
mig til hvad fællesmængden af /bin/sh-kommandoerne på Solaris, Irix,
og Linux tilbød tilbage i 90'erne engang. Det er vist stortset det
oprindelige System V.

Det har skam også vist sig at have fordele. Man bliver sjældent
overrasket over at ting virker anderledes på en anden platform.

Men kan ksh93 så noget blæret?

--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk - Unix, Java, Web, Netværk, Århus

Peter Makholm (10-08-2004)
Kommentar
Fra : Peter Makholm


Dato : 10-08-04 18:16

Kent Friis <nospam@nospam.invalid> writes:

> Det gør måske ingen forskel når man sidder og tester med 10 filer,
> men med 10000 filer eller mere kan det betyde forskellen på om
> scriptet tager sekunder (xargs) eller minutter (while read).

brother@localhost:/tmp/foo$ for i in `seq 1 10000` ; do echo foo > foo$i ; done
brother@localhost:/tmp/foo$ time find -type f | while read f ; do touch $f ; done

real 0m46.220s
user 0m25.485s
sys 0m17.812s
brother@localhost:/tmp/foo$ time find -type f | xargs touch

real 0m0.224s
user 0m0.044s
sys 0m0.179s
brother@localhost:/tmp/foo$ time find -type f | while read f ; do touch $f ; done

real 0m44.236s
user 0m26.252s
sys 0m17.832s
brother@localhost:/tmp/foo$ time find -type f | xargs touch

real 0m0.228s
user 0m0.034s
sys 0m0.194s
brother@localhost:/tmp/foo$

Er 10000 filer meget?

Ptjaaa, ikke i et tradspool - og jeg lagre netop news i et tradspool
for at kunne lave den slags stunts.

--
Peter Makholm | The four letter word beginning with L?
peter@makholm.net | It's life, love, libc or lisp
http://hacking.dk | -- Depending on you point of view

Kent Friis (10-08-2004)
Kommentar
Fra : Kent Friis


Dato : 10-08-04 18:29

Den Tue, 10 Aug 2004 19:16:11 +0200 skrev Peter Makholm:
> Kent Friis <nospam@nospam.invalid> writes:
>
>> Det gør måske ingen forskel når man sidder og tester med 10 filer,
>> men med 10000 filer eller mere kan det betyde forskellen på om
>> scriptet tager sekunder (xargs) eller minutter (while read).
>
> brother@localhost:/tmp/foo$ for i in `seq 1 10000` ; do echo foo > foo$i ; done
> brother@localhost:/tmp/foo$ time find -type f | while read f ; do touch $f ; done
>
> real 0m46.220s
> user 0m25.485s
> sys 0m17.812s
> brother@localhost:/tmp/foo$ time find -type f | xargs touch
>
> real 0m0.224s
> user 0m0.044s
> sys 0m0.179s
>
> Er 10000 filer meget?

Tallet var grebet ud af luften, sæt selv flere nuller på

Forskellen er allerede tydelig, du har 46 sekunder på while read,
og kun 2 tiendedel-sekunder på xargs.

Mvh
Kent
--
Help test this great MMORPG game - http://www.eternal-lands.com/

Thorbjoern Ravn Ande~ (10-08-2004)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 10-08-04 21:22

"Lasse Hillerøe Petersen" <lhp+news@toft-hp.dk> writes:

> (Og til Thorbjørn, for en sikkerheds skyld: Hvis du kommer med spydige
> kommentarer om mange forks, Perls fortræffeligheder, eller risikoen for
> mellemrum i filnavne, kommer du til at høre et *PLONK* så højt at du er
> døv resten af ugen. )

Nøh, jeg vil bare lige sige at jeg _kun_ læste ovenstående fordi du
nævnte i et andet svar jeg læste ved et tilfælde at du havde skrevet
noget, _og_ at jeg skulle gøre mig umage for at finde det. Gør du det
bare for at drille?

Hvis du gerne vil fortælle mig noget, virker det bedst at gøre det som
(et svar på)+ et af mine indlæg.

Og når det så er sagt, så har jeg efterhånden brændt mig så mange
gange på "hvad bliver nu ekspanderet hvornår, og evalueret hvorhenne"
at jeg normalt ved den slags ting laver noget i stil med:

1) lav find-mumlemumle der finder de filnavne jeg skal bruge
2) hæld dem ind i en print "kommando ... $1 ...." løkke
3) gem resultatet i en tmp.sh fil.

Herefter kan man se hvad der venter en med less tmp.sh, inden man med
bævende sind kører "sh -xv tmp.sh".

Metodikken kan især anbefales ved dybdegående ændringer af mappenavne :)
--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk - Unix, Java, Web, Netværk, Århus

Lasse Hillerøe Peter~ (10-08-2004)
Kommentar
Fra : Lasse Hillerøe Peter~


Dato : 10-08-04 21:55

In article <yu2wu06zqtg.fsf@luhmann.netc.dk>,
Thorbjoern Ravn Andersen <nospam0000@c.dk> wrote:
> Nøh, jeg vil bare lige sige at jeg _kun_ læste ovenstående fordi du
> nævnte i et andet svar jeg læste ved et tilfælde at du havde skrevet
> noget, _og_ at jeg skulle gøre mig umage for at finde det. Gør du det
> bare for at drille?

Jep.

Nej, jeg var ikke specielt ude efter at du skulle læse det; blot at du,
hvis du læste det, afstod fra de sædvanlige spydigheder. Men forgæves,
du finder jo bare på nye spydigheder.

> Hvis du gerne vil fortælle mig noget, virker det bedst at gøre det som
> (et svar på)+ et af mine indlæg.

Jeg vil ikke fortælle dig noget, du ved jo så meget i forvejen.

> Herefter kan man se hvad der venter en med less tmp.sh, inden man med
> bævende sind kører "sh -xv tmp.sh".

En tilsvarende metode bruger jeg også når jeg er doven og vil gå med
livrem og seler, jeg laver dog blot en udskiftning af |more med |sh
eller |sudo sh. Bestemt anbefalelsesværdig. Men til fx en simpel global
søg-og-erstat i en masse filer bruger jeg nævnte metode.

-Lasse

Thorbjoern Ravn Ande~ (10-08-2004)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 10-08-04 23:04

"Lasse Hillerøe Petersen" <lhp+news@toft-hp.dk> writes:

> > noget, _og_ at jeg skulle gøre mig umage for at finde det. Gør du det
> > bare for at drille?
>
> Jep.

Forsigtig med det - jeg har jo ladet mig fortælle at den slags ting
kan få en i folks kill-filtre.

> Nej, jeg var ikke specielt ude efter at du skulle læse det; blot at du,
> hvis du læste det, afstod fra de sædvanlige spydigheder. Men forgæves,
> du finder jo bare på nye spydigheder.

Tak du CWB for det.

> En tilsvarende metode bruger jeg også når jeg er doven og vil gå med
> livrem og seler

Det er min erfaring at den indstilling sparer en mest tid i længden.
Hvorfor er du ikke doven og forsigtig _HELE_ tiden?
--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk - Unix, Java, Web, Netværk, Århus

Lasse Hillerøe Peter~ (11-08-2004)
Kommentar
Fra : Lasse Hillerøe Peter~


Dato : 11-08-04 07:28

In article <yu2zn528xav.fsf@luhmann.netc.dk>,
Thorbjoern Ravn Andersen <nospam0000@c.dk> wrote:

> Det er min erfaring at den indstilling sparer en mest tid i længden.
> Hvorfor er du ikke doven og forsigtig _HELE_ tiden?

Det er for kedeligt.

-Lasse

Thorbjoern Ravn Ande~ (11-08-2004)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 11-08-04 07:51

"Lasse Hillerøe Petersen" <lhp+news@toft-hp.dk> writes:

> > Det er min erfaring at den indstilling sparer en mest tid i længden.
> > Hvorfor er du ikke doven og forsigtig _HELE_ tiden?
>
> Det er for kedeligt.

Hver sin smag. Jeg synes "Dagens find + xargs variant" har tabt
nyhedens interesse, men jeg bliver jo også handlingslammet når musens
batterier løber tør.

--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk - Unix, Java, Web, Netværk, Århus

Michael U. Hove (10-08-2004)
Kommentar
Fra : Michael U. Hove


Dato : 10-08-04 23:13

Lasse Hillerøe Petersen wrote:
> In article <yu2wu06zqtg.fsf@luhmann.netc.dk>,
> Thorbjoern Ravn Andersen <nospam0000@c.dk> wrote:
>
>>Nøh, jeg vil bare lige sige at jeg _kun_ læste ovenstående fordi du
>>nævnte i et andet svar jeg læste ved et tilfælde at du havde skrevet
>>noget, _og_ at jeg skulle gøre mig umage for at finde det. Gør du det
>>bare for at drille?
>
>
> Jep.

[snip]

blah blah blah...

> -Lasse

"Hvor mange UNIX-nørder skal der til for at skrive et *meget simpelt*
shell-script?"

"Een til at skrive scriptet, og 20 andre til at skændes om xargs kunne
have gjort det bedre!"

Og så siger man at IT-folk har for lidt fritid...

/mvh
michael

--
"You have acquired a scroll entitled ´irk gleknow mizk´ --More--
This is an IBM Manual scroll. --More--
You are permanently confused."
Dave Decot.

Peter Makholm (11-08-2004)
Kommentar
Fra : Peter Makholm


Dato : 11-08-04 19:40

Thorbjoern Ravn Andersen <nospam0000@c.dk> writes:

> "Lasse Hillerøe Petersen" <lhp+news@toft-hp.dk> writes:
>
>> *Ikke portabelt* med andre ord.
>
> Er du stadig helt sikker på at jeg ikke må sige et kvæk om Perl?

Når perl bliver beskrevet i POSIX (eller SUSvNoget) *så* må du kvække
løs.

--
Peter Makholm | The four letter word beginning with L?
peter@makholm.net | It's life, love, libc or lisp
http://hacking.dk | -- Depending on you point of view

Thorbjoern Ravn Ande~ (11-08-2004)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 11-08-04 19:50

Peter Makholm <peter@makholm.net> writes:

> >> *Ikke portabelt* med andre ord.
> >
> > Er du stadig helt sikker på at jeg ikke må sige et kvæk om Perl?
>
> Når perl bliver beskrevet i POSIX (eller SUSvNoget) *så* må du kvække
> løs.

Hvorfor er dét et krav? Xargs-evangelisterne holder sig da heller
ikke til POSIX?

Jeg vil hævde at "perl -i.bak -e 's/foo/bar/g' *.h" nok er den mest
portable løsning der har været nævnt endnu (og så har jeg slet ikke
snakket om unyttige forks, og fejlhåndtering endnu).

Når det så er sagt, ville jeg i dag nok bare skifte over til
Eclipse-vinduet, og bede den gøre det :)
--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk - Unix, Java, Web, Netværk, Århus

Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408849
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste