/ 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
Bash script og filnavne med ' '
Fra : Mogens Dybæk Christe~


Dato : 25-08-03 19:53

Det her script driller:

--------------
#!/usr/bin/sh -x
IFS="
"
echo -n "$@ "
fn=`echo $@ |awk '{gsub(" ","\\\\ ");print;}'`
grep -v \$Name: "$fn" |md5sum
--------------

Scriptet er lavet til at kalde fra find. For hver fil skal MD5 summen
beregnes, men uden den linie hvor versionssystemet har indsat seneste
label.

Problemet er, at det ikke virker på filer med ' ' i filnavnet selv om
det lykkes at fikse navnet med AWK i 4. linie.

grep-kommandoen ekspanderes til f. eks.

grep -v $Name: './et\ eller\ andet/fil.cpp' |md5sum

men grep melder at den ikke kan finde filen. Scriptet virker fint når
det fodres med pæne filnavne.

Hvis samme kommando gives direkte fra kommandolinien virker det! Hvad
er forskellen på at bruge "\ " når man selv taster (med god hjælp af
tab-completion) og når et script opbygger kommandoen?

Jeg har prøvet mange varianter med flere '"' og/eller flere '\', men
det virker ikke. Heller ikke et forsøg på at pipe til grep fra cat
ændrede noget.

Problemet er oplevet på cygwin Bash, så undskyld jeg spørger her.

- Det er netop reproduceret på Debian woody.

--
Mogens Dybæk Christensen
e-mail mdc at mail dot tele dot dk

 
 
Klaus Alexander Seis~ (25-08-2003)
Kommentar
Fra : Klaus Alexander Seis~


Dato : 25-08-03 19:58

Mogens Dybæk Christensen skrev:

> #!/usr/bin/sh -x
> IFS="
> "
> echo -n "$@ "
> fn=`echo $@ |awk '{gsub(" ","\\\\ ");print;}'`
> grep -v \$Name: "$fn" |md5sum
> --------------
>
> Scriptet er lavet til at kalde fra find.

Hjlæper det heller ikke noget at bruge en kombination af find og
xargs, begge med "-0"? Fx

   find . blah-blah -print0 | xargs -r0 script-der-driller


// Klaus

--
><>    unselfish actions pay back better

Klaus Alexander Seis~ (25-08-2003)
Kommentar
Fra : Klaus Alexander Seis~


Dato : 25-08-03 20:11

Jeg skrev:

>> #!/usr/bin/sh -x
>> IFS="
>> "
>> echo -n "$@ "
>> fn=`echo $@ |awk '{gsub(" ","\\\\ ");print;}'`
>> grep -v \$Name: "$fn" |md5sum
>> --------------
>>
>> Scriptet er lavet til at kalde fra find.
>
> Hjælper det heller ikke noget at bruge en kombination af find
> og xargs, begge med "-0"? Fx
>
>    find . blah-blah -print0 | xargs -r0 script-der-driller

Nå ja, og så ville jeg nok droppe det med "$@" og bruge "$1" i
stedet:

#!/usr/bin/sh -x
# Bor den shell virkelig i /usr/bin?
echo -n "$1 "
grep -v '$Name' "$1" | md5sum
#

og så kalde det fra xargs med

   ··· | xargs -r0 -n1 script-der-forhåbentlig-ikke-driller


// Klaus

--
><>    unselfish actions pay back better

Mogens Dybæk Christe~ (26-08-2003)
Kommentar
Fra : Mogens Dybæk Christe~


Dato : 26-08-03 22:19

Klaus Alexander Seistrup <spam@magnetic-ink.dk> writes:

> Jeg skrev:
>
> >> #!/usr/bin/sh -x
> >> IFS="
> >> "
> >> echo -n "$@ "
> >> fn=`echo $@ |awk '{gsub(" ","\\\\ ");print;}'`
> >> grep -v \$Name: "$fn" |md5sum
> >> --------------
> >>
> >> Scriptet er lavet til at kalde fra find.
> >
> > Hjælper det heller ikke noget at bruge en kombination af find
> > og xargs, begge med "-0"? Fx
> >
> >    find . blah-blah -print0 | xargs -r0 script-der-driller
>

Det er ikke find-niveauet der fejler. Filnavnet kommer korrekt ind i
dette script, men grep forstår det ikke!

> Nå ja, og så ville jeg nok droppe det med "$@" og bruge "$1" i
> stedet:

Så arbejder grep kun på første ord i navnet.

IFS="
"
er nok overflødig, men var et af de tricks Google kom op med.
>
> #!/usr/bin/sh -x
> # Bor den shell virkelig i /usr/bin?

Hmm, på cygwin gør den!

> echo -n "$1 "
> grep -v '$Name' "$1" | md5sum
> #
>
Så er vi tilbage ved min version 0.0, som heller ikke virker.

> og s? kalde det fra xargs med
>
>    ??? | xargs -r0 -n1 script-der-forh?bentlig-ikke-driller
>
>

Her er hvad jeg får ud af at køre scriptet på min woody:

$ find et\ eller\ andet/ -type f |xargs -r0 my_md5.sh
+ IFS=

+ echo -n 'et eller andet/t.t
'
et eller andet/t.t
++ echo 'et eller andet/t.t'
++ awk '{gsub(" ","\\ ");print;}'
+ fn=et\ eller\ andet/t.t
+ grep -v '$Name:' 'et\ eller\ andet/t.t'
grep: et\ eller\ andet/t.t: No such file or directory
+ md5sum
d41d8cd98f00b204e9800998ecf8427e
$ cd et\ eller\ andet/
$ md5sum t.t
2722022950aad7dcc304bf0facb4598e t.t
$

Som du kan se:
- Hele filnavnet kommer over i scriptet my_md5.sh
- Der indsættes '\' foran ' ' i navnet
- grep får det modificerede navn som argument, men fejler

Kopierer man linien "grep -v '$Name:' 'et\ eller\ andet/t.t'"
og udfører den direkte, virker det!

$ grep -v '$Name:' et\ eller\ andet/t.t |md5sum
2722022950aad7dcc304bf0facb4598e

Hvad er galt? Hvorfor parses det ikke ens i de 2 tilfælde?

--
Mogens Dybæk Christensen
e-mail mdc at mail dot tele dot dk

Klaus Alexander Seis~ (27-08-2003)
Kommentar
Fra : Klaus Alexander Seis~


Dato : 27-08-03 06:10

Mogens Dybæk Christensen skrev:

> Det er ikke find-niveauet der fejler. Filnavnet kommer korrekt
> ind i dette script, men grep forstår det ikke!

Men har du afprøvet metoden med at bruge "-print0" til find og "-0"
til xargs? Det er standardløsningen på sære filnavne - grep eller ej.

>> grep -v '$Name' "$1" | md5sum
>
>   :
>
> + grep -v '$Name:' 'et\ eller\ andet/t.t'
> grep: et\ eller\ andet/t.t: No such file or directory

Du lagde mærke til at der er enkeltplinger om $Name og alm. gåseøjne
omkring $1, ikk'?


// Klaus

--
><>    unselfish actions pay back better

Klaus Alexander Seis~ (27-08-2003)
Kommentar
Fra : Klaus Alexander Seis~


Dato : 27-08-03 06:14

Jeg skrev:

> Du lagde mærke til at der er enkeltplinger om $Name og alm.
> gåseøjne omkring $1, ikk'?

Se her:

#v+

$ TESTVAR='foo
> bar
> fly'
$ echo $TESTVAR
foo bar fly
$ echo "$TESTVAR"
foo
bar
fly
$ echo '$TESTVAR'
$TESTVAR
$

#v-


// Klaus

--
><>    unselfish actions pay back better

Mogens Dybæk Christe~ (27-08-2003)
Kommentar
Fra : Mogens Dybæk Christe~


Dato : 27-08-03 21:24

Klaus Alexander Seistrup <spam@magnetic-ink.dk> writes:

>
> Du lagde mærke til at der er enkeltplinger om $Name og alm. gåseøjne
> omkring $1, ikk'?
>
>

Prøvede igen, det virker! Det var -print0 der gjorde udslaget.

$ find et\ eller\ andet/ -type f -print0 |xargs -r0 my_md5.sh
+ echo -n 'et eller andet/t.t '
et eller andet/t.t + grep -v '$Name:' 'et eller andet/t.t'
+ md5sum
2722022950aad7dcc304bf0facb4598e

Sådan ser my_md5.sh ud nu:
--------------
#!/bin/sh -x
echo -n "$@ "
grep -v '$Name:' "$1" |md5sum
--------------

Takker for udvist deltagelse!!

--
Mogens Dybæk Christensen
e-mail mdc at mail dot tele dot dk

Mogens Dybæk Christe~ (28-08-2003)
Kommentar
Fra : Mogens Dybæk Christe~


Dato : 28-08-03 19:51

Lige en tilføjelse hvis andre roder med noget lignende. Kommandoen
skal være

$ find et\ eller\ andet/ -type f -print0 |xargs -r0 -n1 my_md5.sh

-n1 manglede i forrige posting, gør at scriptet kaldes med en fil ad
gangen. Så virker det.

--
Mogens Dybæk Christensen
e-mail mdc at mail dot tele dot dk

Kent Friis (26-08-2003)
Kommentar
Fra : Kent Friis


Dato : 26-08-03 17:20

Den 25 Aug 2003 20:52:35 +0200 skrev Mogens Dybæk Christensen:
>Det her script driller:
>
>--------------
>#!/usr/bin/sh -x
>IFS="
>"
>echo -n "$@ "
>fn=`echo $@ |awk '{gsub(" ","\\\\ ");print;}'`
>grep -v \$Name: "$fn" |md5sum
>--------------
>
>Scriptet er lavet til at kalde fra find. For hver fil skal MD5 summen
>beregnes, men uden den linie hvor versionssystemet har indsat seneste
>label.

Noget i denne retning?

#!/bin/sh
for i in "$@"
do
grep -v \$Name: "$i" | md5sum
done

Mvh
Kent
--
Journalist: En der har forstand på at skrive artikler, men typisk
ikke på det artiklerne handler om.

Kent Friis (26-08-2003)
Kommentar
Fra : Kent Friis


Dato : 26-08-03 17:57

Den Tue, 26 Aug 2003 16:19:57 +0000 (UTC) skrev Kent Friis:
>Den 25 Aug 2003 20:52:35 +0200 skrev Mogens Dybæk Christensen:
>>Det her script driller:
>>
>>--------------
>>#!/usr/bin/sh -x
>>IFS="
>>"
>>echo -n "$@ "
>>fn=`echo $@ |awk '{gsub(" ","\\\\ ");print;}'`
>>grep -v \$Name: "$fn" |md5sum
>>--------------
>>
>>Scriptet er lavet til at kalde fra find. For hver fil skal MD5 summen
>>beregnes, men uden den linie hvor versionssystemet har indsat seneste
>>label.
>
>Noget i denne retning?
>
>#!/bin/sh
>for i in "$@"

Eller bare:

for i
>do
>grep -v \$Name: "$i" | md5sum
>done

Mvh
Kent
--
F0 0F C7 C8 - Intel Pentium bug

Mogens Dybæk Christe~ (26-08-2003)
Kommentar
Fra : Mogens Dybæk Christe~


Dato : 26-08-03 22:29

Tak men se svaret til Klaus. BTW, det handler ikke om et enkelt dir,
men et filtræ med nogen 1000 filer.

Efter et crash har vi ude på jobbet brug for at validere restore af
vores RCS-arkiver (egentlig MKS) på serveren. Derfor er det nødvendigt
at sammenligne 2 filtræer, arbejdskopien og det versionssystemet tror
er head rev.

--
Mogens Dybæk Christensen
e-mail mdc at mail dot tele dot dk

Søg
Reklame
Statistik
Spørgsmål : 177560
Tips : 31968
Nyheder : 719565
Indlæg : 6408952
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste