|
| Mystik med mv Fra : Henrik Christian Gro~ |
Dato : 21-11-01 14:53 |
|
Hvis jeg har en fil der hedder "fil med mellemrum" kan jeg flytte den
hvis jeg bare husker at sætte gåseøjne om filnavnet, men det virker
tilsyneladende ikke når jeg bruger find til at generere filnavnene.
Se blot følgende (echo er for at undgå at zsh overskriver uddata):
serena% find . -name fil\* -printf "\"%p\" "; echo
"./fil med mellemrum"
serena% mv `find . -name fil\* -printf "\"%p\" "` /tmp
mv: "./fil: No such file or directory
mv: med: No such file or directory
mv: mellemrum": No such file or directory
serena% mv "./fil med mellemrum" /tmp
serena%
Gør jeg noget galt, og er der nogen der har et forslag til hvordan jeg
kan gøre?
Jeg ved godt `find ... -exec ...` er en mulighed, men jeg ville gerne
have noget der var hurtigere.
..Henrik
--
"Unix, Perl og Ole har man for at slippe for at gøre
arbejdet selv."
| |
Peter Makholm (21-11-2001)
| Kommentar Fra : Peter Makholm |
Dato : 21-11-01 15:05 |
|
Henrik Christian Grove <grove@sslug.dk> writes:
> Hvis jeg har en fil der hedder "fil med mellemrum" kan jeg flytte den
> hvis jeg bare husker at sætte gåseøjne om filnavnet, men det virker
> tilsyneladende ikke når jeg bruger find til at generere filnavnene.
Hvis du bruger gnu-tools kan du lave lade find producerer
0-terminerede strenge og lade xargs bruge disse. Mon ikke foelgende
virker:
$ tmp_mv() { mv "$@" /tmp }
$ find . -name fil\* -print0 | xargs -0 -s ??? tmp_mv
Du skal lige erstatte ??? med et passende stort tal.
--
Når folk spørger mig, om jeg er nørd, bliver jeg altid ilde til mode
og svarer lidt undskyldende: "Nej, jeg bruger RedHat".
-- Allan Olesen på dk.edb.system.unix
| |
Kim Petersen (22-11-2001)
| Kommentar Fra : Kim Petersen |
Dato : 22-11-01 15:04 |
|
Peter Makholm <peter@makholm.net> writes:
> Henrik Christian Grove <grove@sslug.dk> writes:
>
> > Hvis jeg har en fil der hedder "fil med mellemrum" kan jeg flytte den
> > hvis jeg bare husker at sætte gåseøjne om filnavnet, men det virker
> > tilsyneladende ikke når jeg bruger find til at generere filnavnene.
>
> Hvis du bruger gnu-tools kan du lave lade find producerer
> 0-terminerede strenge og lade xargs bruge disse. Mon ikke foelgende
> virker:
>
> $ tmp_mv() { mv "$@" /tmp }
> $ find . -name fil\* -print0 | xargs -0 -s ??? tmp_mv
Hmm - hvorfor ikke bare blive i find - og dermed aldrig komme over
parameter grænsen (selvom den er _stor_):
find . -name fil\* -exec mv "\{\}" /tmp \;
eller mere generelt:
flyt_lignende() {
find . -name $1 -exec mv "\{\}" $2 \;
}
--
Mvh. Kim Petersen /| Tlf: +4575831551 |\ Jomfru Ingefreds Vej 18
Software Engineer / | Fax: (none atm.) | \ 7100 Vejle
LSS / | Email: kim@vindinggaard.dk | \ DK - Danmark
| |
Thorbjoern Ravn Ande~ (23-11-2001)
| Kommentar Fra : Thorbjoern Ravn Ande~ |
Dato : 23-11-01 12:08 |
|
Kim Petersen <kim@vindinggaard.dk> writes:
> Hmm - hvorfor ikke bare blive i find - og dermed aldrig komme over
> parameter grænsen (selvom den er _stor_):
Det afhaenger af hvor dyrt det er at fyre nye processer af.
--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk
| |
Peter Makholm (22-11-2001)
| Kommentar Fra : Peter Makholm |
Dato : 22-11-01 15:10 |
|
Kim Petersen <kim@vindinggaard.dk> writes:
> Hmm - hvorfor ikke bare blive i find - og dermed aldrig komme over
> parameter grænsen (selvom den er _stor_):
Det stod i opgavebeskrivelsen.
--
Når folk spørger mig, om jeg er nørd, bliver jeg altid ilde til mode
og svarer lidt undskyldende: "Nej, jeg bruger RedHat".
-- Allan Olesen på dk.edb.system.unix
| |
Kim Petersen (22-11-2001)
| Kommentar Fra : Kim Petersen |
Dato : 22-11-01 15:33 |
|
Peter Makholm <peter@makholm.net> writes:
> Kim Petersen <kim@vindinggaard.dk> writes:
>
> > Hmm - hvorfor ikke bare blive i find - og dermed aldrig komme over
> > parameter grænsen (selvom den er _stor_):
>
> Det stod i opgavebeskrivelsen.
Ja, det gjorde der - hmm - jeg skal lære at læse
--
Mvh. Kim Petersen /| Tlf: +4575831551 |\ Jomfru Ingefreds Vej 18
Software Engineer / | Fax: (none atm.) | \ 7100 Vejle
LSS / | Email: kim@vindinggaard.dk | \ DK - Danmark
| |
Henrik Christian Gro~ (23-11-2001)
| Kommentar Fra : Henrik Christian Gro~ |
Dato : 23-11-01 13:06 |
|
Peter Makholm <peter@makholm.net> writes:
> Hvis du bruger gnu-tools kan du lave lade find producerer
> 0-terminerede strenge og lade xargs bruge disse. Mon ikke foelgende
> virker:
Jeg havde overvejet nulterminerede strenge før jeg gav mig til at finde
ud af hvordan jeg fik find til at sætte gåseøjne omkring filnavne (det
var dog en hurtig søgning i SSLUG's e-post-arkiv, for at finde noget jeg
vidste jeg selv havde skrevet). Jeg var bare ikke i humør til
shell-scripting, og det kunne jeg se blev nødvendigt fordi xargs kun kan
sætte ind sidst på linien.
..Henrik
--
Når man kører Linux er dette også en mulighed:
Modeline "912x684" 64.00 912 966 1104 1232 684 699 706 734
| |
Peter Makholm (23-11-2001)
| Kommentar Fra : Peter Makholm |
Dato : 23-11-01 13:37 |
|
Henrik Christian Grove <grove@sslug.dk> writes:
> vidste jeg selv havde skrevet). Jeg var bare ikke i humør til
> shell-scripting, og det kunne jeg se blev nødvendigt fordi xargs kun kan
> sætte ind sidst på linien.
Det ser ud til at print0-trikket også virker på FreeBSD. Hvad
GNU-xargs kan som FreeBSD-xargs ikke ser ud til at kunne er at sætte
ind midt i linjen:
$ find . -print0 | xargs mv -0i mv "{}" /tmp
Det virker bare desvære kun med et argument ad gangen, så der er igen
problemet med at starte mange processer op.
--
Når folk spørger mig, om jeg er nørd, bliver jeg altid ilde til mode
og svarer lidt undskyldende: "Nej, jeg bruger RedHat".
-- Allan Olesen på dk.edb.system.unix
| |
Kent Friis (23-11-2001)
| Kommentar Fra : Kent Friis |
Dato : 23-11-01 18:18 |
|
Den Fri, 23 Nov 2001 13:37:21 +0100 skrev Peter Makholm:
>Henrik Christian Grove <grove@sslug.dk> writes:
>
>> vidste jeg selv havde skrevet). Jeg var bare ikke i humør til
>> shell-scripting, og det kunne jeg se blev nødvendigt fordi xargs kun kan
>> sætte ind sidst på linien.
>
>Det ser ud til at print0-trikket også virker på FreeBSD. Hvad
>GNU-xargs kan som FreeBSD-xargs ikke ser ud til at kunne er at sætte
>ind midt i linjen:
>
>$ find . -print0 | xargs mv -0i mv "{}" /tmp
>
>Det virker bare desvære kun med et argument ad gangen, så der er igen
>problemet med at starte mange processer op.
Prøv om ikke du kan ændre default antal argumenter på xargs (her er
det "xargs -n 10" der skal bruges).
Mvh
Kent
--
Det skete i de dage i november engang
at de første kataloger satte hyggen igang
| |
Peter Makholm (11-12-2001)
| Kommentar Fra : Peter Makholm |
Dato : 11-12-01 11:35 |
|
Peter Makholm <peter@makholm.net> writes:
> Hvis du bruger gnu-tools kan du lave lade find producerer
Jeg nærlæste lige manualsiden til GNU mv og kom til at tænke på denne
tråd.
> $ tmp_mv() { mv "$@" /tmp }
> $ find . -name fil\* -print0 | xargs -0 -s ??? tmp_mv
En pænere løsning, hvis man er ligeglad med standarder og bruger
GNU-værktøjer:
$ find . -name fil\* -print0 | xargs -0 mv --target-directory=/tmp
--
Når folk spørger mig, om jeg er nørd, bliver jeg altid ilde til mode
og svarer lidt undskyldende: "Nej, jeg bruger RedHat".
-- Allan Olesen på dk.edb.system.unix
| |
Kim Petersen (22-11-2001)
| Kommentar Fra : Kim Petersen |
Dato : 22-11-01 15:40 |
|
Henrik Christian Grove <grove@sslug.dk> writes:
> Hvis jeg har en fil der hedder "fil med mellemrum" kan jeg flytte den
> hvis jeg bare husker at sætte gåseøjne om filnavnet, men det virker
> tilsyneladende ikke når jeg bruger find til at generere filnavnene.
>
> Se blot følgende (echo er for at undgå at zsh overskriver uddata):
> serena% find . -name fil\* -printf "\"%p\" "; echo
> "./fil med mellemrum"
> serena% mv `find . -name fil\* -printf "\"%p\" "` /tmp
> mv: "./fil: No such file or directory
> mv: med: No such file or directory
> mv: mellemrum": No such file or directory
> serena% mv "./fil med mellemrum" /tmp
> serena%
>
> Gør jeg noget galt, og er der nogen der har et forslag til hvordan jeg
> kan gøre?
> Jeg ved godt `find ... -exec ...` er en mulighed, men jeg ville gerne
> have noget der var hurtigere.
Hvis de er i samme directory - dvs. du ikke nødvendigvis har brug for
find:
space_mv_tmp() {
mv "$@" /tmp
}
space_mv_tmp fil*
--
Mvh. Kim Petersen /| Tlf: +4575831551 |\ Jomfru Ingefreds Vej 18
Software Engineer / | Fax: (none atm.) | \ 7100 Vejle
LSS / | Email: kim@vindinggaard.dk | \ DK - Danmark
| |
Michael Hjorth (23-11-2001)
| Kommentar Fra : Michael Hjorth |
Dato : 23-11-01 00:28 |
|
Henrik Christian Grove wrote:
>
> Hvis jeg har en fil der hedder "fil med mellemrum" kan jeg flytte den
> hvis jeg bare husker at sætte gåseøjne om filnavnet, men det virker
> tilsyneladende ikke når jeg bruger find til at generere filnavnene.
>
> Se blot følgende (echo er for at undgå at zsh overskriver uddata):
> serena% find . -name fil\* -printf "\"%p\" "; echo
> "./fil med mellemrum"
> serena% mv `find . -name fil\* -printf "\"%p\" "` /tmp
> mv: "./fil: No such file or directory
> mv: med: No such file or directory
> mv: mellemrum": No such file or directory
> serena% mv "./fil med mellemrum" /tmp
> serena%
>
> Gør jeg noget galt, og er der nogen der har et forslag til hvordan jeg
> kan gøre?
> Jeg ved godt `find ... -exec ...` er en mulighed, men jeg ville gerne
> have noget der var hurtigere.
>
Shellen evaluerer kun en gang så de gåseøjne du sætter på med printf
bliver en del af strengen og IKKE evalueret. Løsningen er:
mv "`find . -name "fil*" -print`" /tmp
Michael.
| |
Michael Hjorth (23-11-2001)
| Kommentar Fra : Michael Hjorth |
Dato : 23-11-01 00:52 |
|
Michael Hjorth wrote:
> Shellen evaluerer kun en gang så de gåseøjne du sætter på med printf
> bliver en del af strengen og IKKE evalueret. Løsningen er:
>
> mv "`find . -name "fil*" -print`" /tmp
>
Dette virker selvfølgelig kun hvis der kun er een fil.
Hvis der er flere må du gøre sådan her i stedet:
find . -name "fil*" -print | while read a
do
mv "$a" /tmp
done
Michael.
| |
|
|