Toon posts:

[ksh] spaties weg uit filenames

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een AIX machine als fileserver (samba). Helaas staan er nu allemaal files op met spaties in de naam.
Die spaties wil ik er uit hebben.
Wil dus een scriptje hebben wat alle spaties eruit haalt en bijv. vervangt voor underscores.
Kom er niet uit. Iemand een idee?

  • deadinspace
  • Registratie: Juni 2001
  • Laatst online: 16-08 16:08

deadinspace

The what goes where now?

In Debian zit (bij de perl package) een programmaatje 'rename', waarmee je dit erg eenvoudig voor elkaar zou kunnen krijgen.
code:
1
2
3
4
5
6
[marcelm@nothing marcelm]$ man rename | head -9 | tail -5
NAME
     rename - renames multiple files

SYNOPSIS
     rename [ -v ] perlexpr [ files ]

Het programmaatje is geschreven in perl (en is dus arguably een script te noemen), dus als je perl op je AIX bak hebt, kan ik je 'rename' wel mailen, het is sowieso een erg handig programmaatje.

  • odysseus
  • Registratie: Augustus 2000
  • Nu online

odysseus

Debian GNU/Linux Sid

code:
1
$filename_stripped = `sed s/\s/_/g $filename`

Dit vervangt alle whitespace in door een _.

[edit: err, foutje, sed wil natuurlijk een bestand als argument hebben, geen enkele string...]

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


Verwijderd

In debian:
code:
1
rename '/$1:/; s/ /_/g' *

rename is eigenlijk een perl script. Ik heb het ook getest op redhat... Maar dit werkt niet. Redhat's rename is volgens mij een binary die hetzelfde doet dan mv.

Verwijderd

Topicstarter
het is AIX, dus debian commando's gaan helaas niet werken :(
Odysseus, ik denk zelf ook aan die sed string, maar waar ik niet uitkom:
ls | grep -v "$0" | while read line
do
<en hier moet dan de move van $line komen, die door sed heen gestuurd wordt.>
done

Moet de filename eerst dus bewerken. Kan dat direct? cat oid?

  • deadinspace
  • Registratie: Juni 2001
  • Laatst online: 16-08 16:08

deadinspace

The what goes where now?

Op woensdag 12 december 2001 19:57 schreef odysseus het volgende:
code:
1
$filename_stripped = `sed s/\s/_/g $filename`

Dit vervangt alle whitespace in door een _.

[edit: err, foutje, sed wil natuurlijk een bestand als argument hebben, geen enkele string...]
En dus zou het
code:
1
$filename_stripped = `echo "$filename" | sed s/\s/_/g`

worden. Maar ik betwijfel of ksh dit lust...
Op woensdag 12 december 2001 19:58 schreef razor_harm het volgende:
code:
1
rename '/$1:/; s/ /_/g' *
Waarom die '/$1:/;' erin? Bij mijn weten is
code:
1
rename 's/ /_/' *

genoeg. Dit werkt in ieder geval wel.

Verwijderd

Topicstarter
Ksh lust het wel. script werkt.
dit is het:
#!/usr/bin/ksh
ls | grep -v rename.ksh | while read line
do
filename=`echo "$line" | sed s/\s/_/g`
echo $filename
mv "$line" $filename
done

  • deadinspace
  • Registratie: Juni 2001
  • Laatst online: 16-08 16:08

deadinspace

The what goes where now?

Op woensdag 12 december 2001 20:04 schreef Buddha het volgende:
het is AIX, dus debian commando's gaan helaas niet werken :(
Maar heb je perl?
Odysseus, ik denk zelf ook aan die sed string, maar waar ik niet uitkom:
ls | grep -v "$0" | while read line
do
<en hier moet dan de move van $line komen, die door sed heen gestuurd wordt.>
done

Moet de filename eerst dus bewerken. Kan dat direct? cat oid?
In sh zou iig het volgende moeten werken:
code:
1
for I in *; do mv "$I" $(echo "$I" | sed 's/ /_/g'); done

  • odysseus
  • Registratie: Augustus 2000
  • Nu online

odysseus

Debian GNU/Linux Sid

code:
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/perl
my ($o, $f);
open (FILE, "input");
while (<FILE>)
{
  $o = $_;
  s/\s/_/g;
  $n = $_;
  `mv $o $n` if ($o ne $n);
}
close FILE;

Hierbij moet je een bestand 'input' hebben dat alle bestanden bevat waarom het gaat. Dat bestand kun je makkelijke krijgen door in die samba-dir iets te draaien als 'find * > input'.

[Disclaimer: dit scriptje is volledig uit het hoofd geconstrueeerd en heeft nog niet de effectieve tests doorstaan die produkten van Programming BV tot zulke kwalitatief hoogstaande produkten maakt. Dientengevolge kunnen wij geen garantie geven voor de correcte werking van dit programma of enig onderdeel van voornoemd programma. Voorts wijzen wij uitdrukkelijk verantwoordelijkheid af voor eventuele schadeposten en ongevallen die zich voordoen bij het gebruik van dit produkt in bedrijfskritische omgevingen, zowel met als zonder commerciele bedoelingen ;) ]

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


Verwijderd

Topicstarter
ehhh, wel ff opletten dat je s/ /_/g doet, en niet /s\s/_/g
;)

  • odysseus
  • Registratie: Augustus 2000
  • Nu online

odysseus

Debian GNU/Linux Sid

Op woensdag 12 december 2001 20:23 schreef Buddha het volgende:
ehhh, wel ff opletten dat je s/ /_/g doet, en niet /s\s/_/g
;)
:?
Overal wordt toch \s gebruikt en niet s\s? \s betekent gewoon 'alle whitespace'. Mocht iemand dan zo gek zijn om in een bestandsnaam een horizontale tab neer te zetten, dan wordt die tenminste ook meegepikt.

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


Verwijderd

Topicstarter
nee, dat is iig op AIX niet zo, als je daar s/\s/_/g doet vervang je alle s'en in de filenaam voor een _
;)

  • odysseus
  • Registratie: Augustus 2000
  • Nu online

odysseus

Debian GNU/Linux Sid

Op woensdag 12 december 2001 20:28 schreef Buddha het volgende:
nee, dat is iig op AIX niet zo, als je daar s/\s/_/g doet vervang je alle s'en in de filenaam voor een _
;)
Lijkt me stug dat perl daar anders werkt dan onder alle andere platforms >:) . Maar mocht dat niet werken, dan kun je ook [:space:] of \p{IsSpace} gebruiken...
Maar als AIX dat inderdaad niet ondersteunt: heeft iemand een idee waarom dan niet? Het lijkt me nog al iets vreemds om zoiets wat toch vrij standaard is (naast perl kan in ieder geval sed het ook, en ik denk ook awk wel) aan te passen of zelfs niet te ondersteunen...

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


  • DennisBoom
  • Registratie: Mei 2000
  • Laatst online: 11-08 11:59
tr -d " " does the trick.

Geen beurs, geen tempo


  • deadinspace
  • Registratie: Juni 2001
  • Laatst online: 16-08 16:08

deadinspace

The what goes where now?

Op woensdag 12 december 2001 20:28 schreef Buddha het volgende:
nee, dat is iig op AIX niet zo, als je daar s/\s/_/g doet vervang je alle s'en in de filenaam voor een _
;)
Zet je s/\s/_/g wel tussen quotes? (dus 's/\s/_/g')
Anders gaat je shell die \s lopen interpreten... kannie nix van maken (\s betekent afaik niks), dus maakt hij er s van.

  • odysseus
  • Registratie: Augustus 2000
  • Nu online

odysseus

Debian GNU/Linux Sid

Dat moet inderdaad bij de sed-oplossing, maar voor het perl-script zou dat niet nodig moeten zijn. Dat wordt immers niet door ksh geinterpreteerd, maar door perl. En die weet wel wat hij met een \s moet.

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


Verwijderd

Topicstarter
Ja, maar ik heb dus helemaal geen perl geïnstalleerd op die doos, dus dat gaat niet op....

  • deadinspace
  • Registratie: Juni 2001
  • Laatst online: 16-08 16:08

deadinspace

The what goes where now?

Op woensdag 23 januari 2002 17:14 schreef Buddha het volgende:
Ja, maar ik heb dus helemaal geen perl geïnstalleerd op die doos, dus dat gaat niet op....
Beetje vreemd om na anderhalve maand nog te replyen...

Maar ik vroeg in de *allereerste* reply al of je perl had... Als je nou meteen had gezegd dat dat niet zo was, had dat een hoop gerommel daarmee bespaard.
Pagina: 1