/ 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
Fjerne mellemrum fra filnavne ?
Fra : Mads Jensen


Dato : 25-04-04 18:36

Hej

Er der ikke en let måde at fjerne mellemrum i flere filnavne på en gang?
Mange tak på forhånd!

mvh.
Mads
--
Mads Jensen - http://www.ddfr.dk
I have not got a suspicious email!

Flon's Law:
   There is not now, and never will be, a language in which it is
the least bit difficult to write bad programs.

 
 
Peter Jensen (25-04-2004)
Kommentar
Fra : Peter Jensen


Dato : 25-04-04 19:22

Mads Jensen wrote:

> Er der ikke en let måde at fjerne mellemrum i flere filnavne på en gang?

man rename

For eksempel vil følgende oneliner erstatte alle mellemrum i alle navne
i det bibliotek du står i:

while rename ' ' '_' *\ *;do echo -n .;done

--
PeKaJe

Did you hear that, Marge? She called me a baboon! The stupidest,
ugliest, smelliest ape of them all! -- Homer Simpson, Lisa's Substitute

Mads Jensen (25-04-2004)
Kommentar
Fra : Mads Jensen


Dato : 25-04-04 21:04

Peter Jensen wrote:
> while rename ' ' '_' *\ *;do echo -n .;done
Mange tak! Forstår nu ikke helt hvad "echo " skal gøre godt for, men det
er måske bare for at få noget til at stå noget under do ?

mvh.
Mads
--
Mads Jensen - http://www.ddfr.dk
I have not got a suspicious email!

Flon's Law:
   There is not now, and never will be, a language in which it is
the least bit difficult to write bad programs.

Peter Jensen (25-04-2004)
Kommentar
Fra : Peter Jensen


Dato : 25-04-04 22:46

Mads Jensen wrote:

>> while rename ' ' '_' *\ *;do echo -n .;done
>
> Mange tak! Forstår nu ikke helt hvad "echo " skal gøre godt for, men
> det er måske bare for at få noget til at stå noget under do ?

Ja, egentligt

Men ellers fortæller antallet af punktummer også hvor mange mellemrum
der var i det navn med flest mellemrum. Af en eller anden grund har jeg
på et tidspunkt haft brug for den information, og jeg har siden ikke
pillet det ud af mit script fordi det ikke gør nogen skade. Hvis du vil
have en "renere" løsning, så prøv med dette:

while rename ' ' '_' *\ *;do :;done

--
PeKaJe

"I am thinking you have the intelligence of a rock. An extremely stupid rock."
   -- "Rick" responding to the kook "Alan Connor" in COLA

Troels Arvin (25-04-2004)
Kommentar
Fra : Troels Arvin


Dato : 25-04-04 19:40

On Sun, 25 Apr 2004 19:35:31 +0200, Mads Jensen wrote:

> Er der ikke en let måde at fjerne mellemrum i flere filnavne på en gang?

Jeg ville oprette følgende lille script (husk at gøre det
eksekvérbart), kalde det "rename_to_nonspace" og fx. lægge det i ~/bin/
(se bort fra =====-linjerne):

==========================================
#!/bin/sh

newname=`echo "$1" | sed 's/[[:blank:]]//g'`
mv "$1" $newname
==========================================

Jeg ville da gå til rette katalog (dér, hvor der skal omdøbes filer) og
køre:

find . -name "* *" -exec rename_to_nonspace {} \;

"{}" betyder: indsæt fundne navn her
"\;" betyder: her slutter argumentet til -exec

Hvis du skal gøre det rekursivt og har katalognavne med mellemrum, kan du
opleve at du må køre sidstnævnte find-udtryk flere gange indtil du ikke
længere får brok-beskeder (som handler om, at find åbenbart serverer
fundne filnavne i breath-first rækkefølge, og at man derfor kan have
omdøbt et katalog før en indholdt fil med mellemrum skal omdøbes).

--
Greetings from Troels Arvin, Copenhagen, Denmark


Jesper Harder (25-04-2004)
Kommentar
Fra : Jesper Harder


Dato : 25-04-04 21:46

Troels Arvin <troels@arvin.dk> writes:

> On Sun, 25 Apr 2004 19:35:31 +0200, Mads Jensen wrote:
>
>> Er der ikke en let måde at fjerne mellemrum i flere filnavne på en
>> gang?
>
> Jeg ville oprette følgende lille script
>
> ==========================================
> #!/bin/sh
>
> newname=`echo "$1" | sed 's/[[:blank:]]//g'`
> mv "$1" $newname
> ==========================================

Hvad så hvis et bibliotek indeholder filerne "foobar" og "foo bar"?
Ups, indholdet af den meget vigtige "foobar"-fil er slettet!

('rename' løsningen har vist samme svaghed).

--
Jesper Harder <http://purl.org/harder/>

Troels Arvin (25-04-2004)
Kommentar
Fra : Troels Arvin


Dato : 25-04-04 22:43

On Sun, 25 Apr 2004 22:46:11 +0200, Jesper Harder wrote:

>> ==========================================
>> #!/bin/sh
>>
>> newname=`echo "$1" | sed 's/[[:blank:]]//g'`
>> mv "$1" $newname
>> ==========================================
>
> Hvad så hvis et bibliotek indeholder filerne "foobar" og "foo bar"?
> Ups, indholdet af den meget vigtige "foobar"-fil er slettet!

Good point; version 2:

============================================
#!/bin/sh

newname=`echo "$1" | sed 's/[[:blank:]]//g'`
if [ -e $newname ]; then
echo "Refused to overwrite $newname"
exit 1
else
mv "$1" $newname
fi
============================================

--
Greetings from Troels Arvin, Copenhagen, Denmark


Peter Jensen (26-04-2004)
Kommentar
Fra : Peter Jensen


Dato : 26-04-04 00:17

Troels Arvin wrote:

> newname=`echo "$1" | sed 's/[[:blank:]]//g'`

I Bash er det nye navn ${1// }. Noget simplere, og uden det store
forbrug af resourcer. Et smartere program vil desuden shifte igennem
alle parametre, så en 'find | xargs' virker bedre. Her er mit forslag:

========================================================================

#/bin/bash

# While there are parameters
while [ $# != 0 ]
do
# If original file actually exists
if [ -e "${1}" ]
then
# If target file already exists
if [ -e "${1// }" ]
then
# Only warn if it isn't the same filename as the original
if [ "${1}" != "${1// }" ]
then
echo "${1// } already exists! ${1} not moved"
fi
# If target file doesn't exist
else
mv -i "${1}" "${1// }"
fi
else
echo "${1}" not found
fi
# Repeat for the next parameter
shift
done

========================================================================

Hvis man foretrækker at bruge '_' i stedet for helt at fjerne
mellemrummet, så kan man bruge ${1// /_} i stedet for ${1// }. Jeg
bruger desuden '-i' til 'mv', så brugeren spørges i tilfælde af at en
uforudset fejl opstår, som kunne finde på at overskrive filer.

--
PeKaJe

Microsoft products are easy to administrate. Anyone can do it!
Even if you don't want them to ... -- Jim Richardson, in COLA

Ivar Madsen (25-04-2004)
Kommentar
Fra : Ivar Madsen


Dato : 25-04-04 22:51

Jesper Harder skrev i -dk.edb.system.unix:

>> #!/bin/sh
>> newname=`echo "$1" | sed 's/[[:blank:]]//g'`
>> mv "$1" $newname
>> ==========================================
> Hvad så hvis et bibliotek indeholder filerne "foobar" og "foo bar"?
> Ups, indholdet af den meget vigtige "foobar"-fil er slettet!

Så sætter du et check på om filen n$ewname findes, og hvis den gør, så kommer
programmet med en fejl melling, og ellers så forsætter det.
Checket kan f.eks se ud noget i retningen af

ls $name > /dev/null
if $? > 0
then
echo $newname ' findes, hvad vil du så?'
else
mv "$1" $newname


Det er ikke testet, men jeg går udfra at ls giver reslutatkoden 0 hvis den
faktisk finder den fil, men giver som parameter, og 1 hvis den ikke findes.

--
Med venlig hilsen Ivar Madsen
--------------------------------------------------------------------------------
http://milli.dk/webupdate/ nu i version 0.3.3 nogle sider meldtes konstant
opdateret, dette er fixet, båndbredebegrænsningen er desvære fjernet igen.

Peter Jensen (25-04-2004)
Kommentar
Fra : Peter Jensen


Dato : 25-04-04 23:47

Ivar Madsen wrote:

>> Hvad så hvis et bibliotek indeholder filerne "foobar" og "foo bar"?
>> Ups, indholdet af den meget vigtige "foobar"-fil er slettet!
>
> Så sætter du et check på om filen n$ewname findes, og hvis den gør, så
> kommer programmet med en fejl melling, og ellers så forsætter det.

Korrekt.

> Checket kan f.eks se ud noget i retningen af
>
> ls $name > /dev/null
> if $? > 0

Nej nu må du lige holde op! Hvad er der galt med dette:

if [ -e $name ]

Det bruger ingen ekstra process, hvilket nok betyder noget hvis der er
en million filer der skal renames

> then
> echo $newname ' findes, hvad vil du så?'
> else
> mv "$1" $newname

Mangler afsluttende 'fi'.

> Det er ikke testet, men jeg går udfra at ls giver reslutatkoden 0 hvis
> den faktisk finder den fil, men giver som parameter, og 1 hvis den
> ikke findes.

Hvis du endelig vil teste på returværdien fra et program, så brug 'if
foo', hvor 'foo' er det program du kalder. Returværdien 0 er true, alle
andre er false.

Må jeg til sidst anbefale følgende glimrende læsning:
http://www.tldp.org/LDP/abs/html/index.html

--
PeKaJe

If we men married the women we deserved, we should have a very bad time of it.
      -- Oscar Wilde

Michael Knudsen (08-05-2004)
Kommentar
Fra : Michael Knudsen


Dato : 08-05-04 17:25

Peter Jensen wrote:
> Nej nu må du lige holde op! Hvad er der galt med dette:
>
> if [ -e $name ]
>
> Det bruger ingen ekstra process, hvilket nok betyder noget hvis der er
> en million filer der skal renames

Det goer den -- i hvert fald paa mit system, OpenBSD 3.5:

   $ which test [
   /bin/test
   /bin/[
   $ ls -i /bin/[ /bin/test
   147034 /bin/[
   147034 /bin/test

test og [ er samme fil.

   $ [ -e /etc/passwd ] || echo hurra
   $ [ -e /etc/passwd ] && echo hurra
   hurra

(/etc/passwd findes paa mit system) :)

Mvh. Michael.   
--
Rumour is information distilled so finely that it can filter through
anything.
-- (Terry Pratchett, Feet of Clay)

Peter Jensen (08-05-2004)
Kommentar
Fra : Peter Jensen


Dato : 08-05-04 18:13

Michael Knudsen wrote:

>> Nej nu må du lige holde op! Hvad er der galt med dette:
>>
>> if [ -e $name ]
>>
>> Det bruger ingen ekstra process, hvilket nok betyder noget hvis der
>> er en million filer der skal renames
>
> Det goer den -- i hvert fald paa mit system, OpenBSD 3.5:
>
>    $ which test [
>    /bin/test
>    /bin/[
>    $ ls -i /bin/[ /bin/test
>    147034 /bin/[
>    147034 /bin/test
>
> test og [ er samme fil.

Men spørgsmålet er om den er det program der bliver kørt. Din shell vil
formentligt fortolke de mest almindelige kommandoer for dig. F.eks. vil
'echo' ikke spawne en process i bash, men '/bin/echo' vil. Det samme
gælder formentligt for test og [. En simpel (uvidenskabelig) test viser
at indbyggede kommandoer ikke spawner en process, med mindre det direkte
kræves:

   $ ps;echo Hello;ps
    PID TTY TIME CMD
   24970 pts/4 00:00:00 bash
   24988 pts/4 00:00:00 ps
   Hello
    PID TTY TIME CMD
   24970 pts/4 00:00:00 bash
   24989 pts/4 00:00:00 ps

   $ ps;/bin/echo Hello;ps
    PID TTY TIME CMD
   24970 pts/4 00:00:00 bash
   24990 pts/4 00:00:00 ps
   Hello
    PID TTY TIME CMD
   24970 pts/4 00:00:00 bash
   24992 pts/4 00:00:00 ps

I bash kan man bruge 'enable' til at slå indbyggede funktioner til og
fra. Prøv selv om ikke din shell også gør det samme. Hvis ikke, så har
jeg endnu en grund til ikke at køre BSD

--
PeKaJe

Your business will go through a period of considerable expansion.

Michael Knudsen (09-05-2004)
Kommentar
Fra : Michael Knudsen


Dato : 09-05-04 11:28

Peter Jensen wrote:
>>test og [ er samme fil.
>
>
> Men spørgsmålet er om den er det program der bliver kørt.
[snip]

Jep, det ved jeg godt. Min pointe er, at du ikke kan vaere sikker.

> I bash kan man bruge 'enable' til at slå indbyggede funktioner til og
> fra. Prøv selv om ikke din shell også gør det samme. Hvis ikke, så har
> jeg endnu en grund til ikke at køre BSD

Hvad shellen (og userland generelt) goer har intet med kernen at goere.
Jeg forstaar desuden ikke, at du ser det som en fordel, at shellen
bruger interne udgaver af test, echo etc. Man vinder udelukkende en
smule performance, men hvis det er i hoejsaedet, er sh det forkerte
sprog til opgaven.

Jeg ser det udelukkende som en ulempe, at min shell lige overtager
styringen. Det er MS Office Clippy om igen. Hvis jeg har rettet i
/bin/test eller udvidet echo, saa skal jeg til at boevle med en shell,
der ikke vil udfoere dem, fordi den mener, at den er smartere.

Mvh. Michael.
--
Rumour is information distilled so finely that it can filter through
anything.
-- (Terry Pratchett, Feet of Clay)

Peter Jensen (09-05-2004)
Kommentar
Fra : Peter Jensen


Dato : 09-05-04 15:08

Michael Knudsen wrote:

>>> test og [ er samme fil.
>>
>> Men spørgsmålet er om den er det program der bliver kørt.
>
> Jep, det ved jeg godt. Min pointe er, at du ikke kan vaere sikker.

Hvis jeg har skrevet '#!/bin/bash' i toppen af scriptet, så kan jeg være
sikker nok. Pointen er at man burde bruge funktioner der *kan* være
indbyggede, i stedet for at lave dumme kald til 'ls' for at finde ud af
om en fil eksisterer.

>> I bash kan man bruge 'enable' til at slå indbyggede funktioner til og
>> fra. Prøv selv om ikke din shell også gør det samme. Hvis ikke, så
>> har jeg endnu en grund til ikke at køre BSD
>
> Hvad shellen (og userland generelt) goer har intet med kernen at
> goere.

Nej, men er der nogen BSD versioner der kører med GNU værktøjerne som
standard? Hvis ikke, så foretrækker jeg at blive ved Linux hvor GNU er
normen. Disse værktøjer har typisk forbedret funktionalitet i forhold
til de traditionelle.

> Jeg forstaar desuden ikke, at du ser det som en fordel, at shellen
> bruger interne udgaver af test, echo etc. Man vinder udelukkende en
> smule performance,

En smule er det nu ikke. Jeg har på et tidspunkt skrevet et script om,
så kørselstiden blev nedsat til omtrent 5% af det oprindelige. Alt
sammen ved at bruge shell built-ins i stedet for grep, awk, cut, ls,
osv. Igen, hvis der er tale om et script der skal køre igennem
millioner af entries i en log-file, så kan det betyde en del.

> men hvis det er i hoejsaedet, er sh det forkerte sprog til opgaven.

Måske, måske ikke. Hvis det tager længere tid at skrive programmet i et
compilet sprog end det ville tage at stykke scriptet sammen og køre det,
så er der jo ikke vundet noget. Ved konsekvent at programmere
ordentligt og udnytte de interne funktioner fuldt ud, kan man sikre sig
at scriptet er optimalt nok til at kunne konkurrere med alternativerne.
En anden grund til at favorisere shell-scripts er at de er fleksible.

> Jeg ser det udelukkende som en ulempe, at min shell lige overtager
> styringen.

Det er da dig der bestemmer om den skal dét. Der er bare ikke nogen
reel fordel ved at bruge de eksterne funktioner, da de ifølge
standarderne skal gøre det samme (så vidt jeg husker).

> Det er MS Office Clippy om igen.

Nej *nu* må du lige holde op! Dét kan du ikke mene seriøst ...

> Hvis jeg har rettet i /bin/test eller udvidet echo, saa skal jeg til
> at boevle med en shell, der ikke vil udfoere dem, fordi den mener, at
> den er smartere.

Undskyld jeg siger det, men hvis du først begynder at skulle rette i de
filer, så har du større problemer. Hvis det virkelig er et problem for
dig, så tilføj da en linje til at disable de interne funktioner i
/etc/profile (eller noget lignende). Alternativt kan du bruge en shell
der ikke kan noget som helst selv. CMD.EXE lyder som noget for dig

--
PeKaJe

Love is not enough, but it sure helps.

Michael Knudsen (09-05-2004)
Kommentar
Fra : Michael Knudsen


Dato : 09-05-04 16:42

Peter Jensen wrote:
>>>Men spørgsmålet er om den er det program der bliver kørt.
>>
>>Jep, det ved jeg godt. Min pointe er, at du ikke kan vaere sikker.
>
>
> Hvis jeg har skrevet '#!/bin/bash' i toppen af scriptet, så kan jeg være
> sikker nok. Pointen er at man burde bruge funktioner der *kan* være
> indbyggede, i stedet for at lave dumme kald til 'ls' for at finde ud af
> om en fil eksisterer.

Du kan ikke vaere sikker paa, at /bin/bash findes paa systemet. /bin/sh
er der altid -- det skal den vaere. /bin/sh har en i en standard
defineret opfoersel, det har /bin/bash ikke.

>>>I bash kan man bruge 'enable' til at slå indbyggede funktioner til og
>>>fra. Prøv selv om ikke din shell også gør det samme. Hvis ikke, så
>>>har jeg endnu en grund til ikke at køre BSD
>>
>>Hvad shellen (og userland generelt) goer har intet med kernen at
>>goere.
>
>
> Nej, men er der nogen BSD versioner der kører med GNU værktøjerne som
> standard? Hvis ikke, så foretrækker jeg at blive ved Linux hvor GNU er
> normen. Disse værktøjer har typisk forbedret funktionalitet i forhold
> til de traditionelle.

Alle har nogle vaerktoejer fra GNU i base, men jeg ved, at i hvert fald
OpenBSD aktivt er ved at skifte dem ud med BSD-licenserede vaerktoejer.

I oevrigt er jeg ikke ude paa at omvende dig til at koere BSD. Bliv
endelig ved det operativsystem, du kender og har det godt med, til du
(maaske) finder en mangel, som et andet system kan loese for dig.

>>Jeg forstaar desuden ikke, at du ser det som en fordel, at shellen
>>bruger interne udgaver af test, echo etc. Man vinder udelukkende en
>>smule performance,
>
>
> En smule er det nu ikke. Jeg har på et tidspunkt skrevet et script om,
> så kørselstiden blev nedsat til omtrent 5% af det oprindelige. Alt
> sammen ved at bruge shell built-ins i stedet for grep, awk, cut, ls,
> osv. Igen, hvis der er tale om et script der skal køre igennem
> millioner af entries i en log-file, så kan det betyde en del.

Hvor tit har du behov for lige en enkelt gang at lave processering af
flere millioner linier tekst? Hvis det kun drejer sig om en enkelt gang,
er hastigheden ofte ogsaa mindre vigtig hvis ikke ligegyldig.

>>men hvis det er i hoejsaedet, er sh det forkerte sprog til opgaven.
>
>
> Måske, måske ikke. Hvis det tager længere tid at skrive programmet i et
> compilet sprog end det ville tage at stykke scriptet sammen og køre det,
> så er der jo ikke vundet noget.

Der findes da fortolkede sprog, der er langt hurtigere end sh. Tag nu
Perl som eksempel.

> Ved konsekvent at programmere ordentligt og udnytte de interne funktioner
> fuldt ud, kan man sikre sig at scriptet er optimalt nok til at kunne
> konkurrere med alternativerne.

``konsekvent at programmere ordentligt'' -- tager du verdensfreden i
naeste uge? Desuden er jeg ikke sikker paa din paastand om anvendelse af
interne funktioner.

> En anden grund til at favorisere shell-scripts er at de er fleksible.

Hvorledes er de mere fleksible end eksempelvis Perl-scripts? Python?
Ruby? I sh skal du ofte lave mange forskellige krumspring for at opnaa
funktionalitet, der er en del af, igen, eksempelvis Perl.

>>Jeg ser det udelukkende som en ulempe, at min shell lige overtager
>>styringen.
>
>
> Det er da dig der bestemmer om den skal dét. Der er bare ikke nogen
> reel fordel ved at bruge de eksterne funktioner, da de ifølge
> standarderne skal gøre det samme (så vidt jeg husker).

Hvorfor skal jeg fortaelle min shell, at jeg gerne selv vil have
kontrollen? Software skal ikke diktere politik men tilbyde muligheder.

>>Det er MS Office Clippy om igen.
>
>
> Nej *nu* må du lige holde op! Dét kan du ikke mene seriøst ...

Joda. ``Det ser ud som om, du er ved at checke for eksistens af
/etc/passwd. Det kan jeg goere meget smartere for dig paa denne maade.
Godt nok er det ikke saadan, du vil have det gjort, men nu goer jeg det
altsaa saaledes.''

Jeg forstaar ikke, at jeg skal goere den opmaerksom paa, at den
vitterligt skal goere det, jeg beder den om.

>>Hvis jeg har rettet i /bin/test eller udvidet echo, saa skal jeg til
>>at boevle med en shell, der ikke vil udfoere dem, fordi den mener, at
>>den er smartere.
>
>
> Undskyld jeg siger det, men hvis du først begynder at skulle rette i de
> filer, så har du større problemer. Hvis det virkelig er et problem for
> dig, så tilføj da en linje til at disable de interne funktioner i
> /etc/profile (eller noget lignende).

Hvad mener du? Jeg har et problem, fordi noget software har sin egen idé
om, hvordan det skal goere tingene.

> Alternativt kan du bruge en shell der ikke kan noget som helst selv.
> CMD.EXE lyder som noget for dig

Du har vist intet forstaaet. Jeg vil meget gerne have funktionalitet,
men jeg vil ikke have automagiske features, der foregaar bag min ryg og
laver om paa de ting, _jeg_ laver.

Der er himmelvid forskel paa at tilbyde eksempelvis understoettelse af
baade emacs- og vi-taster, og paa at erstatte udfoersel af et program
med en intern funktion. Hvordan kan shellen vide, at programmet ikke har
nogle sideeffekter, som jeg afhaenger af? Det kan den ikke.

Mvh. Michael.
--
Rumour is information distilled so finely that it can filter through
anything.
-- (Terry Pratchett, Feet of Clay)

Jes Vestervang (12-05-2004)
Kommentar
Fra : Jes Vestervang


Dato : 12-05-04 15:16

Mads Jensen <madsj@suspicious.raptus.dk> writes:

> Hej
>
> Er der ikke en let måde at fjerne mellemrum i flere filnavne på en gang?

rename, der følger med perl-pakken i Debian kan det du leder
efter.

$ rename 'y/ /_/' *
....skifter alle mellemrum ud med underscores i alle filer i aktuelle
dir. Svjh. kan den ikke rename rekursivt.
--
mvh Jes Vestervang

Hi! I'm a .signature virus!
Copy me into your ~/.signature to help me spread!

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

Månedens bedste
Årets bedste
Sidste års bedste