/ 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
Identifikation af dos-ASCII filer.
Fra : Tom Frank


Dato : 25-07-02 09:03

Hej,

Jeg arbejder med at konvertere filer fra DOS/Windows ascii filer til
Unix-format. Til det har jeg brug for en et program eller et forslag til et
værktøj til at identificere dos ascii filer, men dos filer der er binært
(dvs. programmer) skal ikke konverteres.

Jeg bruger idag dos2ux, men den konvertere bare uhæmmet både binært og ascii
filer.

mvh Tom Frank



 
 
Torben Simonsen (25-07-2002)
Kommentar
Fra : Torben Simonsen


Dato : 25-07-02 09:56

"Tom Frank" <tofran@hotmail.com> writes:

> Jeg arbejder med at konvertere filer fra DOS/Windows ascii filer til
> Unix-format. Til det har jeg brug for en et program eller et forslag til et
> værktøj til at identificere dos ascii filer, men dos filer der er binært
> (dvs. programmer) skal ikke konverteres.
>
> Jeg bruger idag dos2ux, men den konvertere bare uhæmmet både binært og ascii
> filer.

Noget i denne retning burde virke:

for i in `find . -maxdepth 1 -type f`
do
if file $i | grep text -q -
then
dos2ux $i
fi
done

Jeg forudsætter, at du står i det directory, hvor du har dine
filer liggende. find-kommandoen finder alle normale filer i
dette directory. Hvis du i stedet vil gennemløbe hele
directory-strukturen under dit nuværende directory, så
fjerner du bare "-maxdepth 1" fra find-kommandoen.

Sammensætningen af "file" og "grep" finder alle filer, som
"file" mener indeholder tekst.

Det kan muligvis gøres mere elegant.

--
-- Torben.

Tom Frank (25-07-2002)
Kommentar
Fra : Tom Frank


Dato : 25-07-02 13:55

Tak for hintene.

Men det ser ud til at 'file' er forskellige fra forskellige typer af
Unix'er. I linux fortolker den binære dos-programmer som MS-DOS filer, det
er også godt nok. Men i HPUX fortolker den det som awk-programmer.

Så vidt jeg ved er reglerne defineret et eller andet sted, tror jeg nok. Det
er lidt omstændigt at lave forskellige fortolkninger afhængige af
Unix-typer.

mvh Tom Frank



"Torben Simonsen" <ts@biograferne.dk> wrote in message
news:m3znwgp4nt.fsf@pc115235.stofanet.dk...
> "Tom Frank" <tofran@hotmail.com> writes:
>
> > Jeg arbejder med at konvertere filer fra DOS/Windows ascii filer til
> > Unix-format. Til det har jeg brug for en et program eller et forslag til
et
> > værktøj til at identificere dos ascii filer, men dos filer der er binært
> > (dvs. programmer) skal ikke konverteres.
> >
> > Jeg bruger idag dos2ux, men den konvertere bare uhæmmet både binært og
ascii
> > filer.
>
> Noget i denne retning burde virke:
>
> for i in `find . -maxdepth 1 -type f`
> do
> if file $i | grep text -q -
> then
> dos2ux $i
> fi
> done
>
> Jeg forudsætter, at du står i det directory, hvor du har dine
> filer liggende. find-kommandoen finder alle normale filer i
> dette directory. Hvis du i stedet vil gennemløbe hele
> directory-strukturen under dit nuværende directory, så
> fjerner du bare "-maxdepth 1" fra find-kommandoen.
>
> Sammensætningen af "file" og "grep" finder alle filer, som
> "file" mener indeholder tekst.
>
> Det kan muligvis gøres mere elegant.
>
> --
> -- Torben.



frank damgaard (26-07-2002)
Kommentar
Fra : frank damgaard


Dato : 26-07-02 01:47

Tom Frank <tofran@hotmail.com> wrote:

> Men det ser ud til at 'file' er forskellige fra forskellige typer af
> Unix'er. I linux fortolker den binære dos-programmer som MS-DOS filer, det
> er også godt nok. Men i HPUX fortolker den det som awk-programmer.

"man file" -> siger sikkert /etc/magic eller /usr/share/misc/magic

Problemet er vel mere at HPUX ikke er så beregnet på
blandet DOS/windows/unix ;(

--
Hjælp til begyndere af news og mail:
http://usenet.dk/info/skriveteknik.html
http://www.usenet.dk/netikette/citatteknik.html
http://www.flug.dk/pages/mailinglister/netikette.html

frank damgaard (25-07-2002)
Kommentar
Fra : frank damgaard


Dato : 25-07-02 11:08

Tom Frank <tofran@hotmail.com> wrote:

> Jeg arbejder med at konvertere filer fra DOS/Windows ascii filer til
> Unix-format. Til det har jeg brug for en et program eller et forslag til et
> værktøj til at identificere dos ascii filer, men dos filer der er binært
> (dvs. programmer) skal ikke konverteres.

Har du prøvet "file" kommandoen ?
Den ser lidt på indhold efter diverse regler og returnerer
information om filen.

Du skal så lave et lille shellscript der afhængig af svaret
fra "file" evt. konvereter filen.


--
Frank Damgaard |


Kim Hansen (25-07-2002)
Kommentar
Fra : Kim Hansen


Dato : 25-07-02 11:44

"Tom Frank" <tofran@hotmail.com> writes:

> Hej,
>
> Jeg arbejder med at konvertere filer fra DOS/Windows ascii filer til
> Unix-format. Til det har jeg brug for en et program eller et forslag til et
> værktøj til at identificere dos ascii filer, men dos filer der er binært
> (dvs. programmer) skal ikke konverteres.
>
> Jeg bruger idag dos2ux, men den konvertere bare uhæmmet både binært og ascii
> filer.

Jeg har nogen få gange brug zip. Først pakker jeg alle filerne, og så
pakker jeg dem ud med '-a', det er grimt men det virker.

--
Kim Hansen | |\ _,,,---,,_ | Det er ikke
Dalslandsgade 8, A708 | /,`.-'`' -. ;-;;,_ | Jeopardy.
2300 København S | |,4- ) )-,_. ,\ ( `'-' | Svar _efter_
Phone: 32 88 60 86 | '---''(_/--' `-'\_) | spørgsmålet.

Peder Skyt, Z=nospam (26-07-2002)
Kommentar
Fra : Peder Skyt, Z=nospam


Dato : 26-07-02 03:11

On Thu, 25 Jul 2002 10:03:29 +0200, "Tom Frank" <tofran@hotmail.com>
wrote:

>et program [..] til at identificere dos ascii filer

Det er ikke muligt (sikkert) at gøre det fuldtud automatisk.

Se om mit nedenstående script ikke kan bruges til noget - det var en
morsom lille 2-timers opgave

/Peder Skyt


#!/bin/perl -w
# Slamkode som identificerer potentielle DOS-tekstfiler.
# Bemærk: Der ses kun på CR/LF; f.eks. stoppes IKKE ved ^Z
#
# Ét argument: Navn på fil som ønskes testet
#
# Resultat: En linie (på stdout), som starter med B/A (binær/ascii)
# Der returneres succes såfremt det lykkedes at teste filen.

use strict;
use warnings;
use English;

my $WAY_TOO_BIG = 10_000_000;
my $buflen;
my $buffer;
my $type = 'X'; # default

defined $ARGV[0] or die "Angiv filnavn som argument!\n";

my $filename = $ARGV[0];

-e $filename or die "$filename: findes ikke\n";
-f $filename or die "$filename: er ikke en normal fil\n";

open INFILE, '<'.$filename
or die "$filename: $!\n";

binmode INFILE
or die;

$buflen = read( INFILE, $buffer, $WAY_TOO_BIG );
die if !defined( $buflen );

if ( $buflen == $WAY_TOO_BIG ) {
$type = 'B - filen er alt for stor til at være tekst';
}
elsif ( $buflen == 0 ) {
$type = 'B - filen er tom';
}
elsif ( $buffer =~ /\A[^\cM\cJ]*(?:\cM\cJ[^\cM\cJ]*)+\Z/s ) {
#
# DOS-ASCII:
# Optionalt nogle non-CR/LF tegn
# Efterfulgt af et antal af:
# CRLF
# Optionalt efterfulgt af non-CR/LF tegn
#
$type = 'A';
}
else {
# Binære filer, og almindelige (Unix-)tekstfiler
$type = 'B';
}

close INFILE;

print $type;
1;


Tom Frank (26-07-2002)
Kommentar
Fra : Tom Frank


Dato : 26-07-02 10:29

Tak Peder

Det var det jeg frygtede jeg skulle ud i, men Ok. Jeg prøver at teste på
diverse dos-filer jeg har. Jeg hælder til denne metode i forhold til 'file',
da den er lidt forskellige afhængig af Unix-type.

/Tom Frank

"Peder Skyt, Z=nospam" <pesky@pc.dkZ> wrote in message
newsb1ku00gjmf36h9o0lassc3j5bp1h573f@4ax.com...
> On Thu, 25 Jul 2002 10:03:29 +0200, "Tom Frank" <tofran@hotmail.com>
> wrote:
>
> >et program [..] til at identificere dos ascii filer
>
> Det er ikke muligt (sikkert) at gøre det fuldtud automatisk.
>
> Se om mit nedenstående script ikke kan bruges til noget - det var en
> morsom lille 2-timers opgave
>
> /Peder Skyt
>
>
> #!/bin/perl -w
> # Slamkode som identificerer potentielle DOS-tekstfiler.
> # Bemærk: Der ses kun på CR/LF; f.eks. stoppes IKKE ved ^Z
> #
> # Ét argument: Navn på fil som ønskes testet
> #
> # Resultat: En linie (på stdout), som starter med B/A (binær/ascii)
> # Der returneres succes såfremt det lykkedes at teste filen.
>
> use strict;
> use warnings;
> use English;
>
> my $WAY_TOO_BIG = 10_000_000;
> my $buflen;
> my $buffer;
> my $type = 'X'; # default
>
> defined $ARGV[0] or die "Angiv filnavn som argument!\n";
>
> my $filename = $ARGV[0];
>
> -e $filename or die "$filename: findes ikke\n";
> -f $filename or die "$filename: er ikke en normal fil\n";
>
> open INFILE, '<'.$filename
> or die "$filename: $!\n";
>
> binmode INFILE
> or die;
>
> $buflen = read( INFILE, $buffer, $WAY_TOO_BIG );
> die if !defined( $buflen );
>
> if ( $buflen == $WAY_TOO_BIG ) {
> $type = 'B - filen er alt for stor til at være tekst';
> }
> elsif ( $buflen == 0 ) {
> $type = 'B - filen er tom';
> }
> elsif ( $buffer =~ /\A[^\cM\cJ]*(?:\cM\cJ[^\cM\cJ]*)+\Z/s ) {
> #
> # DOS-ASCII:
> # Optionalt nogle non-CR/LF tegn
> # Efterfulgt af et antal af:
> # CRLF
> # Optionalt efterfulgt af non-CR/LF tegn
> #
> $type = 'A';
> }
> else {
> # Binære filer, og almindelige (Unix-)tekstfiler
> $type = 'B';
> }
>
> close INFILE;
>
> print $type;
> 1;
>



frank damgaard (26-07-2002)
Kommentar
Fra : frank damgaard


Dato : 26-07-02 13:36

Tom Frank <tofran@hotmail.com> wrote:

> Det var det jeg frygtede jeg skulle ud i, men Ok. Jeg prøver at teste på
> diverse dos-filer jeg har. Jeg hælder til denne metode i forhold til 'file',
> da den er lidt forskellige afhængig af Unix-type.

Kan du ikke bare bruge den samme magicfile til alle platforme
du skal anvende, evt. skræddersy din magicfile så den passer netop
til de filtyper du har ?

SYNOPSIS
file [ -bciknsvzL ] [ -f namefile ] [ -m magicfiles ] file

--
Hjælp til begyndere af news og mail:
http://usenet.dk/info/skriveteknik.html
http://www.usenet.dk/netikette/citatteknik.html
http://www.flug.dk/pages/mailinglister/netikette.html

Thorbjoern Ravn Ande~ (26-07-2002)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 26-07-02 11:26

"Peder Skyt, Z=nospam" <pesky@pc.dkZ> writes:

> if ( $buflen == $WAY_TOO_BIG ) {
> $type = 'B - filen er alt for stor til at være tekst';

Den her er jeg ikke enig i. Jeg har adskillige logfiler på mere end
10 Mb.

Umiddelbart er den eneste mulighed vel at se om filen indeholder
ugyldige tegn. Dvs tegn fra 0-31 og fra 128-159. Det kan man klare
med en regexp kombineret med en grep.
--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk - Unix, Java, Web, Netværk, Århus

Peder Skyt, Z=nospam (26-07-2002)
Kommentar
Fra : Peder Skyt, Z=nospam


Dato : 26-07-02 23:13

On 26 Jul 2002 12:25:46 +0200, Thorbjoern Ravn Andersen
<thunderbear@bigfoot.com> wrote:

>Jeg har adskillige logfiler på mere end 10 Mb.

Ved at lave én read (AKA slamkode) slap jeg for at tage hensyn til, om
jeg kom til at skære en CRLF midt over. Jeg valgte 10MB-grænsen fordi
WinDOS-tekstfiler sjældent er større.


>se om filen indeholder ugyldige tegn

Det vigtigste er, at programmet ikke må påstå, at en normal fil er en
CRLF-fil.

Når en CRLF-fil er identificeret, kan man selvfølgelig (som ekstra
sikkerhed) kontrollere, at der endvidere ikke er brugt "ugyldige"
tegnkoder:

if ( $buffer =~ /^[\cI\cJ\cM][ -\xFF]/ ) {
# næh, det var sørme alligevel ikke tekst
}

Men... i visse PC-codepages bruges "overskydende" koder til grafiske
tegn!

Identifikation af codepage er et helt andet (ubehageligt) problem.


/Peder Skyt

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

Månedens bedste
Årets bedste
Sidste års bedste