[linux/Bash] filenames met spaties

Pagina: 1
Acties:
  • 285 views sinds 30-01-2008
  • Reageer

  • capedro
  • Registratie: Oktober 2000
  • Laatst online: 09-04 15:28
DISCLAIMER: Dit is geen script request!

Even het volgende, ik ben bezig met een scriptje:

(Het is een klein deel van het totale script... maar hier gaat ut nie geod ;(
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    #!/bin/bash
    if [ -d '/tmp/finddouble' ]; then
      rm -r /tmp/finddouble
    fi
    mkdir /tmp/finddouble
    find $1 > /tmp/finddouble/filelist
    for files in `cat /tmp/finddouble/filelist`
    do
      if [ -d $files ]; then
        echo 'directory...:'$files
      elif [ -L $files ]; then
        echo 'symlink.....:'$files
      else
        echo 'file........:'$files
        
      fi
    done

Nu krijg ik de volgende output:
code:
1
2
3
4
5
6
7
8
file........:/home/pir/MP3-Collectie/Toto
file........:-
file........:Hold
file........:the
file........:Line
file........:(Live
file........:Japan
file........:1982).MP3

De output moet echter zijn:
code:
1
file........:/home/pir/MP3-Collectie/Toto - Hold the Line (Live Japan 1982).MP3

Mijn vraag is... Hoe krijg ik dat voor elkaar.
* capedro heeft al zitten zoeken :Y)

In de file /tmp/finddouble/filelist staat alles wel gewoon keurig achter elkaar

Nu aub niet aankomen met: moet je maar geen spaties gebruiken :z

Want daarmee kan ik op het werk niet mee aankomen... (er werken ruim 100 mensen op die servert... meeste zijn n :X :X b s).


Wie biedt :?

My weblog


  • odysseus
  • Registratie: Augustus 2000
  • Laatst online: 20:37

odysseus

Debian GNU/Linux Sid

code:
1
2
-    for files in `cat /tmp/finddouble/filelist`
+   for files in `cat /tmp/finddouble/filelist | sed s/\ /\\\ /g`

Je zou ook aanhalingstekens kunnen plaatsen, dat is eigenlijk handiger: er zijn immers nog andere tekens die je moet escapen (@, horizontale tab, etc.).

Leven is het meervoud van lef | In order to make an apple pie from scratch, you must first create the universe.


Verwijderd

staat onder linux de '\ ' niet gelijk aan een ' 'in windows?

Als ik bijvoorbeeld 'mijn documenten' op m'n windows-schijf wil benaderen vanuit de terminal moet ik invoeren:
code:
1
cd /mnt/win_c/Mijn\ documenten/

Verwijderd

Op vrijdag 05 april 2002 17:27 schreef _m0teh0ker_ het volgende:
staat onder linux de '\ ' niet gelijk aan een ' 'in windows?

Als ik bijvoorbeeld 'mijn documenten' op m'n windows-schijf wil benaderen vanuit de terminal moet ik invoeren:
code:
1
cd /mnt/win_c/Mijn\ documenten/
Nou nee niet gelijk, een spatie is een spatie, maar met de \ escape je de spatie zodat ie niet gezien wordt als scheidingsteken van je commando. :) Dit kan namelijk ook:
code:
1
cd '/mnt/win_c/Mijn documenten/'

Het is idd makkelijker zoals sed zegt om quotes te gebruiken, zoals hier boven dus ook gedaan is

  • Jordi
  • Registratie: Januari 2000
  • Niet online

Jordi

#1#1

Op vrijdag 05 april 2002 17:27 schreef _m0teh0ker_ het volgende:
staat onder linux de '\ ' niet gelijk aan een ' 'in windows?
Neej, het is puur dat bash (of een andere shell) alle dingen tussen spaties als aparte parameters ziet, wil je dat niet? Dan zul je het teken moeten escapen met een \ ervoor. Dat wil dan niet zeggen dat "\ " hetzelfde is als " " onder windows :)

Het zal wel niet, maar het zou maar wel.


  • capedro
  • Registratie: Oktober 2000
  • Laatst online: 09-04 15:28
* capedro is er weer...

Ik heb ook nog in perl een scrippie geschreven om het bestand uit te lezen en " aan het begin en eind van de regel.

Tevens ook nog cat -E filenaam gedaan... en hij zet netjes aan het eind van iedere lijn een $.

Nu kan ik natuurlijk het script dusdanig maken dat ie tot-en-met het $-teken zaken toevoegd aan een variabel... maar daar heb ik niet helemaal zin in :(

Ben ook met sed wezen spelen... maar daar kom ik helemaal niet uit :'(

Echter ben ik er wel ondertussen achter dat je door het tussen " plaatsen van filenames in de command-prompt bestanden met spaties kan benaderen.

[-]
Ik zal even nog uitleggen wat voor script het wordt:

Het moet aan de hand van md5sum bestanden gaan zoeken welke meerdere keren op een server voorkomen en vervolgens het gaan rapporteren.

Zeker gezien het feit dat men binnen de organisatie waarvoor het is een aparte download map heeft, en zaken vaak dubbel gedownload worden en onder een andere naam worden weggeschreven maak ik gebruik van md5sum.
[-]

* capedro is kippig... had de reactie van Hieronymus niet goed gelezen |:(

My weblog


Verwijderd

Op vrijdag 05 april 2002 17:30 schreef Jotti het volgende:

[..]

Neej, het is puur dat bash (of een andere shell) alle dingen tussen spaties als aparte parameters ziet, wil je dat niet? Dan zul je het teken moeten escapen met een \ ervoor. Dat wil dan niet zeggen dat "\ " hetzelfde is als " " onder windows :)
Aha,.. zie. Da's een logische verklaring ja.

[&... nu nog zien hoe ik die "s in m'n terminal kan invoeren.
Maar dat heeft met dit topic weer nix te maken...& ik wil niet iemand anders topic vervuilen met mijn offtopic-onderwerpen :)]

Verwijderd

Probeer deze kleine aanpassing in je script eens :)
code:
1
2
3
4
5
6
7
8
9
10
11
12
exec < /tmp/finddouble/filelist
while read files
do
   if [ -d "$files" ]; then
     echo 'directory...:'"$files"
     elif [ -L "$files" ]; then
     echo 'symlink.....:'"$files"
   else
     echo 'file........:'"$files"
   fi
done
exec <&0

Verwijderd

probeer ook eens:
code:
1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
find $1 | while read fname
do
   if [ -d "$fname" ]; then
     echo 'directory...:'"$fname"
   elif [ -L "$fname" ]; then
     echo 'symlink.....:'"$fname"
   else
     echo 'file........:'"$fname"
   fi
done

scheelt weer een hele tempfile gedoe. groetjes :)

  • capedro
  • Registratie: Oktober 2000
  • Laatst online: 09-04 15:28
Yo dudes.... hij doet ut ;)

Thnx....

Ik heb die dingen van wbsoft toegepast... draait als een trein ;)


Everybody thnx...

My weblog

Pagina: 1