Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Wie Dateinamen nach .dat abschneiden?

9 views
Skip to first unread message

Astrid

unread,
Jul 29, 2014, 12:01:38 PM7/29/14
to
Hallo zusammen,

durch einen Fehler bei der automatisierten Dateinamensvergebung
sind leider fehlerhafte Dateinamen entstanden.
Die Dateien sollten nach folgendem Schema benannt sein:
prefix_nummerierungszahl.dat
Doch leider haengen durch einen selbstverursachten Fehler hinter dem
.dat noch einige, von Datei zu Datei unterschiedliche, kryptische Zeichen.

z.B.
prefix_8704.dat ??:w??
prefix_500.dat<?:w
prefix_5950.dat?:w

Kann ich mit einem Befehl die Dateien so umbenennen, das alles, was im Dateinamen noch hinter .dat kommt, wenn da noch was kommt, abgeschnitten wird?

Gruss, Astrid
Message has been deleted

Juergen Ilse

unread,
Jul 29, 2014, 1:01:43 PM7/29/14
to
Martin Τrautmann <t-us...@gmx.net> wrote:
> On Tue, 29 Jul 2014 09:01:38 -0700 (PDT), Astrid wrote:
>> durch einen Fehler bei der automatisierten Dateinamensvergebung
>> sind leider fehlerhafte Dateinamen entstanden.
>> Die Dateien sollten nach folgendem Schema benannt sein:
>> prefix_nummerierungszahl.dat
>> Doch leider haengen durch einen selbstverursachten Fehler hinter dem
>> .dat noch einige, von Datei zu Datei unterschiedliche, kryptische Zeichen.
>>
>> z.B.
>> prefix_8704.dat ??:w??
>> prefix_500.dat<?:w
>> prefix_5950.dat?:w
>
> ich mach sowas immer mit einem
>
> ls *.dat* > x
> vi x
> :%s/(.*)\.dat.*/mv "&" \1.dat/
> :wq
> source x

Warum nicht etwas wie:

for f in *.dat*; do
mv "$f" ${f##dat*}.dat
done

Man koennte den Zieldateinamen natuerlich auch mittels Tools wie sed,
awk oder perl erzeugen, aber wozu wenn die shell das auch allein kann?

Tschuess,
Juergen Ilse (jue...@usenet-verwaltung.de)
--
Ein Domainname ist nur ein Name, nicht mehr und nicht weniger.
Wer mehr hineininterpretiert, hat das Domain-Name-System nicht
verstanden.

Thomas 'PointedEars' Lahn

unread,
Jul 29, 2014, 2:04:35 PM7/29/14
to
Juergen Ilse wrote:

> Warum nicht etwas wie:
>
> for f in *.dat*; do
> mv "$f" ${f##dat*}.dat
> done
>
> Man koennte den Zieldateinamen natuerlich auch mittels Tools wie sed,
> awk oder perl erzeugen, aber wozu wenn die shell das auch allein kann?

Du meintest

for f in *.dat*
do
mv "$f" "${f%%.dat*}.dat"
done

Ansonsten ACK.

--
PointedEars

Twitter: @PointedEars2
Please do not Cc: me. / Bitte keine Kopien per E-Mail.

Astrid

unread,
Jul 29, 2014, 2:13:03 PM7/29/14
to
Hallo zusammen,

mit dem vi habe ich mich nicht getraut, auszuprobieren,
weil ich Sorge hatte, dass dem Dateiinhalt was passiert.

Das mit der for-Schleife hat leider nicht das
gemacht, was ich mir erhofft hatte.

Es hat ein

prefix_8704.dat ??:w??.dat
prefix_500.dat<?:w.dat
prefix_5950.dat?:w.dat

draus gemacht. Es sollte aber ein

prefix_8704.dat
prefix_500.dat
prefix_5950.dat

draus werden.

Gruss, Astrid

Astrid

unread,
Jul 29, 2014, 2:19:04 PM7/29/14
to
Hallo Thomas,

danke, damit tut es. :)

Gruss, Astrid

Friedhelm Waitzmann

unread,
Jul 29, 2014, 2:34:12 PM7/29/14
to
Juergen Ilse:

>Warum nicht etwas wie:

> for f in *.dat*; do
^(1)^^
> mv "$f" ${f##dat*}.dat
^(2) ^^^(3)^^^^
> done

(1) Von diesem Muster werden auch Dateinamen beispiel.dat
erfasst, die nicht geändert werden müssen. Und dabei kommt
dann ein Befehl mv beispiel.dat beispiel.dat heraus. Ob der
gut geht?
(2) Bitte den Options‐Ende‐Anzeiger `--' nicht vergessen! Ohne
ihn gibt's Ärger mit Dateinamen, die mit einem `-' anfangen.
(3) Bitte das Quoting ("...") nicht vergessen! Ohne gibt's Ärger
mit Dateinamen, die white Space enthalten, also z.B. 'ein
Beispiel.datMuell'

Dateinamen der Form beispiel.datMuell sollen auf beispiel.dat gekürzt
werden. Was soll mit einem Dateinamen beispiel.datei.datMuell
geschehen? Soll da beispiel.dat oder beispiel.datei.dat
herauskommen?

Falls beispiel.dat, es soll also am Ende ein möglichst langes
Stück, das auf .dat?* passt, durch .dat ersetzt werden:

for f in *.dat?*
do
mv -- "$f" "${f%%.dat?*}".dat
done

Falls beispiel.datei.dat, es soll also am Ende ein möglichst
kurzes Stück, das auf .dat?* passt, durch .dat ersetzt werden:

for f in *.dat?*
do
mv -- "$f" "${f%.dat?*}".dat
done


Friedhelm

Ulli Horlacher

unread,
Jul 29, 2014, 5:28:21 PM7/29/14
to
Astrid <astri...@gmail.com> wrote:

> Kann ich mit einem Befehl die Dateien so umbenennen, das alles, was im
> Dateinamen noch hinter .dat kommt, wenn da noch was kommt, abgeschnitten
> wird?

Bei vielen UNIXen ist zusammen mit perl das tool rename vorhanden, das
manchmal auch prename heisst. Damit geht das recht einfach:

rename 's/\.dat.*/.dat/' *

Ich hab das original rename noch etwas aufgebohrt:

http://fex.rus.uni-stuttgart.de/fstools/rename.html

Usage: rename [-iv] [-Re] 'oldstring/newstring' files
rename [-iv] [-Re] 'perl-code' files
rename [-iv] [-lu] [-Re] [-dD] files
Options: -i interactive mode: prompt for each file
-v verbose mode
-l translate to lower case
-u translate to upper case
-U translate URL-encoded characters
-d add date
-D add date+time
-R recursive into directory tree
-e edit filenames
Examples: rename '.tar.gz/.tgz' *tar.gz

--
Ullrich Horlacher Server und Virtualisierung
Rechenzentrum IZUS/TIK E-Mail: horl...@tik.uni-stuttgart.de
Universitaet Stuttgart Tel: ++49-711-68565868
Allmandring 30a Fax: ++49-711-682357
70550 Stuttgart (Germany) WWW: http://www.tik.uni-stuttgart.de/

Juergen Ilse

unread,
Jul 30, 2014, 3:36:33 AM7/30/14
to
Hallo,

Thomas 'PointedEars' Lahn <Point...@web.de> wrote:
> Juergen Ilse wrote:
>> Warum nicht etwas wie:
>>
>> for f in *.dat*; do
>> mv "$f" ${f##dat*}.dat
>> done
>>
>> Man koennte den Zieldateinamen natuerlich auch mittels Tools wie sed,
>> awk oder perl erzeugen, aber wozu wenn die shell das auch allein kann?
>
> Du meintest
>
> for f in *.dat*
> do
> mv "$f" "${f%%.dat*}.dat"
> done

Natuerlich. Die Vertauschung von "#" und "%" war ein Versehen.

Christoph 'Mehdorn' Weber

unread,
Jul 30, 2014, 5:49:03 AM7/30/14
to
Hallo!

* Martin Τrautmann <t-us...@gmx.net>:

> ich mach sowas immer mit einem
> ls *.dat* > x
> vi x
> :%s/(.*)\.dat.*/mv "&" \1.dat/
> :wq
> source x

In Ausnahmefällen mach ich das auch, aber meist ist qmv aus den
renameutils einfach praktischer zu handhaben.

Christoph

--
Die Flut hatte ja schliesslich auch Vorteile: Die Semperoper
wird in die Geschichte eingehen als das einzige Theater, das
ein volles Haus hatte, ohne auch nur eine Vorstellung zu geben.
(Hans-Georg Bickel)

Thomas 'PointedEars' Lahn

unread,
Jul 30, 2014, 6:37:23 AM7/30/14
to
Christoph 'Mehdorn' Weber wrote:

> * Martin Τrautmann <t-us...@gmx.net>:
>> ich mach sowas immer mit einem
>> ls *.dat* > x
>> vi x
>> :%s/(.*)\.dat.*/mv "&" \1.dat/
>> :wq
>> source x
>
> In Ausnahmefällen mach ich das auch, aber meist ist qmv aus den
> renameutils einfach praktischer zu handhaben.

Wenn wir schon bei externen Utilities sind:

mmv '*.dat?*' '#1.dat'

mmv(1) erkennt Kollisionen und kann (auch) dann interaktiv arbyten.

Thomas 'PointedEars' Lahn

unread,
Jul 30, 2014, 6:49:59 AM7/30/14
to
Thomas 'Ingrid' Lahn wrote:

> Wenn wir schon bei externen Utilities sind:
>
> mmv '*.dat?*' '#1.dat'
>
> mmv(1) erkennt Kollisionen und kann (auch) dann interaktiv arbyten.

Apropos interaktiv, im Midnight Commander mc(1) geht es so:

1. Dateien auswählen, z. B. <Num+>, *.dat?*, <RET>

2. <F6>

3. Move ... with source mask:
[*.dat?*_____________________________________________]

to:
[*.dat_______________________________________________]

4. "OK"/<RET> oder "Background"

Thomas 'PointedEars' Lahn

unread,
Jul 30, 2014, 6:51:05 AM7/30/14
to
Thomas 'Ingrid' Lahn wrote:

> Wenn wir schon bei externen Utilities sind:
>
> mmv '*.dat?*' '#1.dat'
>
> mmv(1) erkennt Kollisionen und kann (auch) dann interaktiv arbyten.

Apropos interaktiv, im Midnight Commander mc(1) geht es so:

1. Dateien auswählen, z. B. <Num+>, *.dat?*, <RET>

2. <F6>

3. Move ... with source mask:
[*.dat?*_____________________________________________]
[x] Using shell patterns

to:
[*.dat_______________________________________________]

4. "OK"/<RET> oder "Background"

Message has been deleted

Sven Mascheck

unread,
Jul 31, 2014, 1:44:58 PM7/31/14
to
Martin Trautmann wrote:
>> > for f in *.dat*
>> > do
>> > mv "$f" "${f%%.dat*}.dat"
>> > done
[...]
> Weil ich immer mit der for syntax zwischen diversen shells kaempfe hab'
> ich das eben aufgegeben und mach's manuell. Da seh' ich notfalls auch
> eher noch Konflikte, wo ich h�ndisch nachbessern kann.

Meinst Du diese #- und %-Formen der parameter expansion,
oder wirklich die syntax f�r "for"?

Ulli Horlacher

unread,
Jul 31, 2014, 3:29:53 PM7/31/14
to
Martin ?rautmann <t-us...@gmx.net> wrote:

> Weil ich immer mit der for syntax zwischen diversen shells kaempfe

Welches UNIX, das juenger als 10 Jahre ist, hat keine bash dabei?

Die (ba)sh for Syntax ist allerdings etwas ungluecklich umstaendlich.
Ich hab deshalb "with" geschrieben, damit geht dann intuitiver:
with files : command

Beispiel: with *jpg : jpegscale -1024 %f

http://fex.rus.uni-stuttgart.de/fstools/with.html

Detlef Sax

unread,
Jul 31, 2014, 5:49:20 PM7/31/14
to
On Thu, 31 Jul 2014 19:29:53 +0000 (UTC), Ulli Horlacher wrote:
[...]
> Welches UNIX, das juenger als 10 Jahre ist, hat keine bash dabei?
[...]

cat /etc/shells
# $FreeBSD: stable/10/etc/shells 59717 2000-04-27 21:58:46Z ache $
#
[...]
/bin/sh
/bin/csh
/bin/tcsh
/usr/local/bin/bash
/usr/local/bin/rbash

Alles in /usr/local wird aus den Ports bzw. Packages bev�lkert.
Somit habe ich die bash zwar nachinstalliert,
geht anscheinend auch gut Ohne.

Gru�
Detlef
--
Now completly available for online reading:
� 12-Step Horror Stories �
True Tales of Misery, Betrayal and Abuse
http://www.morerevealed.com/library/horror-stories/index.html

Juergen Ilse

unread,
Jul 31, 2014, 8:52:11 PM7/31/14
to
Hallo,

Ulli Horlacher <fram...@rus.uni-stuttgart.de> wrote:
> Martin ?rautmann <t-us...@gmx.net> wrote:
>> Weil ich immer mit der for syntax zwischen diversen shells kaempfe
> Welches UNIX, das juenger als 10 Jahre ist, hat keine bash dabei?

Eine ksh war meistens auch bei denen dabei, die deutlich aelter als
10 Jahre sind. Alle in meinem Vorschlag verwendeten Features funktio-
nieren auch in der ksh (sie funktionieren auch in der ash und dash).

> Die (ba)sh for Syntax ist allerdings etwas ungluecklich umstaendlich.

Was findest du daran umstaendlich? Ich empfinde das Konstrukt eher
als sehr intuitiv.

Tschuess,
Juergen Ilse (jue...@usenetverwaltung.de)

Ulli Horlacher

unread,
Aug 1, 2014, 3:19:36 AM8/1/14
to
Juergen Ilse <jue...@usenet-verwaltung.de> wrote:

> > Die (ba)sh for Syntax ist allerdings etwas ungluecklich umstaendlich.
>
> Was findest du daran umstaendlich?

Dass ein do...done Block zwingend ist, dazu noch mit Kommas als Einzeiler.

for file in *; do xy -z $file; done

versus

with * : xy -z %f

Stefan Reuther

unread,
Aug 1, 2014, 3:05:08 AM8/1/14
to
Martin Trautmann wrote:
> On 30 Jul 2014 07:36:33 GMT, Juergen Ilse wrote:
>>>Du meintest
>>>
>>> for f in *.dat*
>>> do
>>> mv "$f" "${f%%.dat*}.dat"
>>> done
>>
>> Natuerlich. Die Vertauschung von "#" und "%" war ein Versehen.
>
> Weil ich immer mit der for syntax zwischen diversen shells kaempfe hab'
> ich das eben aufgegeben und mach's manuell. Da seh' ich notfalls auch
> eher noch Konflikte, wo ich h�ndisch nachbessern kann.

Die for-Syntax ist nun nicht sonderlich au�ergew�hnlich. 'while' und
'if' funktionieren ja ganz genauso.

Die Ersetzungsregel f�r '%' merk ich mir dar�ber, dass '%' in richtigen
Programmiersprachen ja "modulo", sprich "ohne" bedeutet[1]. '${f%.dat*}'
ist "$f ohne .dat*".

Zur �berpr�fung und Vermeidung von Konflikten stell ich vor den
kritischen Befehl erstmal ein 'echo' bzw. verpasse den 'mv' und
'rm'-Befehlen ein '-i'. Zu irgendwas m�ssen diese Optionen ja auch mal
gut sein.


Stefan

[1] http://www.catb.org/jargon/html/M/modulo.html

Stefan Reuther

unread,
Aug 1, 2014, 4:49:07 AM8/1/14
to
Ulli Horlacher wrote:
> Juergen Ilse <jue...@usenet-verwaltung.de> wrote:
>>>Die (ba)sh for Syntax ist allerdings etwas ungluecklich umstaendlich.
>>
>>Was findest du daran umstaendlich?
>
> Dass ein do...done Block zwingend ist, dazu noch mit Kommas als Einzeiler.
>
> for file in *; do xy -z $file; done

Es gibt Shells, die hier zumindest eine Verk�rzung auf
for file in *; xy -z $file
zulassen.

> versus
>
> with * : xy -z %f

Da kommen vor allem Erinnerungen hoch an die Handst�nde, die man unter
Windows machen muss, wenn man mal ein '%' in dem Befehl braucht, mehrere
Schleifen verschachteln oder in der Schleife noch eine Fallunterschei-
dung treffen will.

Die paar Schl�sselworte sind schnell getippt. Man braucht ja nicht mal
AltGr daf�r.


Stefan

Michael Baeuerle

unread,
Aug 1, 2014, 4:04:35 AM8/1/14
to
Ulli Horlacher wrote:
> Martin Trautmann wrote:
> >
> > Weil ich immer mit der for syntax zwischen diversen shells kaempfe
>
> Welches UNIX, das juenger als 10 Jahre ist, hat keine bash dabei?

NetBSD hat z.B. keine bash im Basissystem (auch die aktuelle Version
nicht). Eine ksh aber schon.
Klar kann man eine bash dazuinstallieren, aber irgendwann kommt der Tag
da ist gerade keine da wenn man eines seiner Scripte ausf�hren m�chte.

Wenn man mit mehreren Unix Varianten arbeitet ist es wirklich sinnvoll
sich auf POSIX sh zu beschr�nken. Einmal ein paar Minuten l�nger nach-
denken und egal was einem sp�ter dahergelaufen kommmt: Einfach drauf-
kopieren und es l�uft mit Bordmitteln.
Message has been deleted

Sven Mascheck

unread,
Aug 3, 2014, 6:12:34 PM8/3/14
to
Martin Trautmann wrote:
> On Thu, 31 Jul 2014 17:44:58 +0000 (UTC), Sven Mascheck wrote:
>> Martin Trautmann wrote:
>> >> > for f in *.dat*
>> [...]
>> > Weil ich immer mit der for syntax zwischen diversen shells kaempfe hab'
>> > ich das eben aufgegeben und mach's manuell. [...]
>>
>> Meinst Du diese #- und %-Formen der parameter expansion,
>> oder wirklich die syntax f�r "for"?
>
> for, foreach, while

Ahso. "for" sollte man kennen, und das ist in allen Bourne-artigen
Shells gleich. Mit "foreach", "while", u.s.w. kann man sich besch�ftigen,
wenn einem "for" nicht mehr ausreicht.

> csh: foreach f (*)

Wenn Du wirklich in csh programmieren mu�t: sie hat mit den bourne-kompatiblen
Shells nichts gemein. Anders gesagt: "bourne-kompatibel" ist wie eine Shell,
damit kann man in praktisch allen Shells skripten. csh ist dann eine ganz
neue Syntax, und au�erdem viel fehlertr�chtiger zu skripten.

Ich vermute aber, Du hast sie nur aufgez�hlt, weil sie es noch
un�bersichtlicher macht. Dann vergi� sie besser.

> bash: for i in (...) ; do
> mv ...
> done

Das gibt es nicht. Vielleicht meinst Du
for (( .... ))
Das ist halt eine weitere Variante (s.o.), die man bei speziellem Bedarf
verwenden kann.

Wie die Aufz�hlung in "for i in ..." entsteht, ist dann eine andere Sache:

for i in 1.dat 2.dat 3.dat; do ...
for i in *.dat; do ...
for i in $(kommando-das-Namen-ausgibt); do

Das hat nichts mit der eigentlichen "for"-Syntax zu tun.
Betrachte es als Baukastensystem (mit allen Vorteilen), aber komplizierter
wird es dadurch nicht.

Juergen Ilse

unread,
Aug 4, 2014, 2:54:36 AM8/4/14
to
Hallo,

Sven Mascheck <masc...@in-ulm.de> wrote:
> Wenn Du wirklich in csh programmieren mußt: sie hat mit den bourne-kompatiblen
> Shells nichts gemein. Anders gesagt: "bourne-kompatibel" ist wie eine Shell,
> damit kann man in praktisch allen Shells skripten. csh ist dann eine ganz
> neue Syntax, und außerdem viel fehlerträchtiger zu skripten.

Es gibt noch eine Menge weiterer Gruende, *nicht* in csh zu scripten:

http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/

> Wie die Aufzählung in "for i in ..." entsteht, ist dann eine andere Sache:
>
> for i in 1.dat 2.dat 3.dat; do ...
> for i in *.dat; do ...
> for i in $(kommando-das-Namen-ausgibt); do
>
> Das hat nichts mit der eigentlichen "for"-Syntax zu tun.
> Betrachte es als Baukastensystem (mit allen Vorteilen), aber komplizierter
> wird es dadurch nicht.

Stimmt.

Christoph 'Mehdorn' Weber

unread,
Aug 8, 2014, 9:09:54 AM8/8/14
to
Hallo!

* Michael Baeuerle <michael....@stz-e.de>:

> Wenn man mit mehreren Unix Varianten arbeitet ist es wirklich sinnvoll
> sich auf POSIX sh zu beschränken. Einmal ein paar Minuten länger nach-
> denken

Im Prinzip ja, aber wenn man doch mal $RANDOM braucht, wird es
schnell häßlich und ich nehme doch die Bash. Zwar kann man sich
verschiedene Ansätze für (nicht unbedingt guten) Zufall denken,
aber etwas Schönes ist mir bisher nicht untergekommen/eingefallen:

RANDOM=$(dd if=/dev/urandom count=1 bs=2 2>/dev/null | cksum | cut -c1-5)

(oder vergleichbare Konstruktionen mit od oder hexdump)

Christoph

--
100MHz Bustakt? Bei uns kommen die nur alle 20 Minuten?!
(Markus Fieber)
Message has been deleted

Juergen Ilse

unread,
Aug 29, 2014, 5:52:15 PM8/29/14
to
Hallo,

Martin ??rautmann <t-us...@gmx.net> wrote:
> On Sun, 3 Aug 2014 22:12:34 +0000 (UTC), Sven Mascheck wrote:
>> > csh: foreach f (*)
>> Wenn Du wirklich in csh programmieren muᅵt: sie hat mit den bourne-kompatiblen
>> Shells nichts gemein. Anders gesagt: "bourne-kompatibel" ist wie eine Shell,
>> damit kann man in praktisch allen Shells skripten. csh ist dann eine ganz
>> neue Syntax, und auᅵerdem viel fehlertrᅵchtiger zu skripten.
>> Ich vermute aber, Du hast sie nur aufgezᅵhlt, weil sie es noch
>> unᅵbersichtlicher macht. Dann vergiᅵ sie besser.
> csh bzw. tcsh war der in der Firma vorgeschrieben-vorinstallierte
> Standard. Mach da mal was dagegen.

Um die volle Funktionalitaet des Systems zu erhalten, ist es ja notwendig,
dass /bin/sh funktioniert (und eine mehr oder wenige bourne-kompatible
shell ist). Es ist also eine /bin/sh vorhanden, die man auch fuer scripte
verwenden koennte. Selbst mit einer csh oder tcsh als login-shell wuerde
wuerde ich die nicht fuer scripte nehmen sondern ggfs. auf /bin/sh zurueck-
greifen.

Juergen P. Meier

unread,
Aug 30, 2014, 4:01:44 AM8/30/14
to
Martin ?rautmann <t-us...@gmx.net>:
> csh bzw. tcsh war der in der Firma vorgeschrieben-vorinstallierte
> Standard. Mach da mal was dagegen.

Du arbeitest bei Checkpoint?
0 new messages