Argh! Hilfe bei Wildcards / regular expressions!

Mahlzeit,

stehe auf dem Schlauch: ich habe für eine Datensicherung bisher eine Datei umbenannt:

mv dateiname.sql dateiname\_`date +%F_%H_%M`.sql

Jetzt gibt es aber mehrere dieser Dateien, alle durchnumeriert: dateiname00.sql, dateiname01.sql, dateiname03.sql… Ich kam also auf die glorreiche Idee, das so zu machen:

mv dateiname??.sql dateiname??\_`date +%F_%H_%M`.sql

Leider klappt das nicht: das Ziel muß ein Verzeichnis sein, wenn man mehrere Dateien als Quelle hat.
Geht das irgendwo mit find? Und wenn ja: wie?

Gruß

Sancho

Mahlzeit,

stehe auf dem Schlauch: ich habe für eine Datensicherung
bisher eine Datei umbenannt:

mv dateiname.sql
dateiname_date +%F_%H_%M.sql

Jetzt gibt es aber mehrere
dieser Dateien, alle durchnumeriert: dateiname00.sql,
dateiname01.sql, dateiname03.sql… Ich kam also auf die
glorreiche Idee, das so zu machen:

mv dateiname??.sql
dateiname??_date +%F_%H_%M.sql

Leider klappt das nicht:
das Ziel muß ein Verzeichnis sein, wenn man mehrere Dateien
als Quelle hat.

Bau Dir doch einfach ne for-Schleife, die die Dateien einzeln durchgeht.

Gruß,

Malte.

Hallo,

probiers mal mit

rename -n 'my $date=`date +%F_%H_%M`;chomp $date;/f(\d\d)\.sql/; $\_ = "\_f$1\_$date.sql;' f\*.sql

wobei f für den ersten Teil deines Dateinamens (vor den Nummern) steht.

Grüße,
Moritz

Mahlzeit,

stehe auf dem Schlauch: ich habe für eine Datensicherung
bisher eine Datei umbenannt:

mv dateiname.sql
dateiname_date +%F_%H_%M.sql

Jetzt gibt es aber mehrere
dieser Dateien, alle durchnumeriert: dateiname00.sql,
dateiname01.sql, dateiname03.sql… Ich kam also auf die
glorreiche Idee, das so zu machen:

mv dateiname??.sql
dateiname??_date +%F_%H_%M.sql

Leider klappt das nicht:
das Ziel muß ein Verzeichnis sein, wenn man mehrere Dateien
als Quelle hat.
Geht das irgendwo mit find? Und wenn ja: wie?

Gruß

Tach,
wie Malte schon schrieb, ne Schleife wäre am einfachsten. Zur Not auch mit find:

find . -name dateiname??.sql |
xargs -n 1 -I {} mv {} {}.$(date +"%Y%m%d%H%M")

(das generiert dann allerdings Dateinamen der Form dateiname??.sql. - ausserdem emuliert xargs -n 1 ja sowas wie eine Schleife)

Mit Schleife siehts dann auch noch schoener aus:

for fname in $(find . -type f -name dateiname??.sql)
do
 mv $fname ${fname%??.sql}\_$(date +"%Y%m%d%H%M).sql
done

gruss
bernhard

Hi Malte,

Bau Dir doch einfach ne for-Schleife, die die Dateien einzeln
durchgeht.

gute Idee, bloß bekomme ich dann statt „dateiname01_Datum.sql“ den nicht brauchbaren „dateiname01.sql_Datum.sql“. Wie parse ich den Dateinamen ohne Extension daraus?

Gruß

Sancho

Hi,

probiers mal mit

rename -n ‚my $date=date +%F_%H_%M;chomp :blush:date;/f(\d\d).sql/; $_ = "_f$1_$date.sql;‘ f*.sql

wobei f für den ersten Teil deines Dateinamens (vor den
Nummern) steht.

Welches f? Bin fast blond :smile:

Im Ernst: die Shell gibt zwar keine Meldung raus, tut aber auch nichts :frowning:

Meine Zeile sah so aus:

rename -n 'my $date=`date +%F_%H_%M`;chomp $date;/dateiname(\d\d)\.sql/; $\_ = "\_dateiname$1\_$date.sql;' dateiname\*.sql

Was mache ich falsch?

Gruß

Sancho

Geht das irgendwo mit find? Und wenn ja: wie?

wie Malte schon schrieb, ne Schleife wäre am einfachsten. Zur
Not auch mit find:
(das generiert dann allerdings Dateinamen der Form
dateiname??.sql. - ausserdem emuliert xargs -n 1
ja sowas wie eine Schleife)

ja, die Schleife wär mir egal, aber das Ergebnis ist nicht das, was ich möchte :frowning:

Gibt es nicht sowas wie bei Windows?

 %~I - Expandiert %I und entfernt alle umschließenden
 Anführungszeichen (").
 %~fI - Expandiert %I zu einem vollständigen Dateinamen.
 %~dI - Erzeugt nur den Laufwerkbuchstaben von %I.
 %~pI - Erzeugt nur den Pfad von %I.
 %~nI - Erzeugt nur den Dateinamen von %I.
 %~xI - Erzeugt nur die Dateierweiterung von %I.
 %~sI - Erzeugter Pfad enthält nur kurze Dateinamen.
 %~aI - Erzeugt die Dateiattribute von %I.
 %~tI - Erzeugt Datum und Zeit von %I.
 %~zI - Erzeugt die Dateigröße von %I.

Gruß

Sancho

Hallo allerseits,

habs dann doch mit der Schleife hingekriegt:

for i in dateiname??.sql; do mv $i ${i%.sql}\_`date +F_%H_%M`.sql; done

Danke an alle!

Gruß

Sancho

Hallo,

Welches f? Bin fast blond :smile:

alle 'f’s, die drin vorkommen (zwei Stück sinds)

Im Ernst: die Shell gibt zwar keine Meldung raus, tut aber
auch nichts :frowning:

rename mit -n sollte ausgeben, welche Dateien es umbenennt, ohne es zu tun. Ohne -n tut es das tatsächlich.

Meine Zeile sah so aus:

rename -n ‚my $date=date +%F\_%H\_%M;chomp $date;/dateiname(\d\d).sql/; $_ =
"_dateiname$1_$date.sql;‘ dateiname*.sql

Na dann hast du ja alles 'f’s durch den Dateinmaen ersetzt.

Was mache ich falsch?

Vielleicht verwendest du das falsche rename. Bei mir sieht

head `which rename`

so aus:

#!/usr/bin/perl -w
#
# This script was developed by Robin Barker ([email protected]),
# from Larry Wall's original script eg/rename from the perl source.
#
# This script is free software; you can redistribute it and/or modify it
# under the same terms as Perl itself.
#
# Larry(?)'s RCS header:
# RCSfile: rename,v Revision: 4.1 Date: 92/08/07 17:20:30 

Aber das ist vielleicht Distributionsabhängig. Iirc hatte ich vor ca. 2 Jahren mal ein Mandrake, dessen rename ganz anders funktioniert hat…

Grüße,
Moritz

Gibt es nicht sowas wie bei Windows?

%~I - Expandiert %I und entfernt alle
umschließenden
Anführungszeichen (").
%~fI - Expandiert %I zu einem vollständigen
Dateinamen.
%~dI - Erzeugt nur den Laufwerkbuchstaben von %I.
%~pI - Erzeugt nur den Pfad von %I.
%~nI - Erzeugt nur den Dateinamen von %I.
%~xI - Erzeugt nur die Dateierweiterung von %I.
%~sI - Erzeugter Pfad enthält nur kurze Dateinamen.
%~aI - Erzeugt die Dateiattribute von %I.
%~tI - Erzeugt Datum und Zeit von %I.
%~zI - Erzeugt die Dateigröße von %I.

Tach Sancho,

wie geht denn sowas? Und vor allen Dingen: wo findet man solche Infos?? (ab und zu braucht man ja auch unter Windoofs man ne Commandline, da kämen diese Erweiterungen ganz gut…).

Ich kann mir vorstellen, was du meinst - such mal unter String-Operations in der ksh/bash manpage (wenigstens die DateiNAMENSmanipulationen sollten sich damit machen lassen…)

gruss
bernhard

gute Idee, bloß bekomme ich dann statt „dateiname01_Datum.sql“
den nicht brauchbaren „dateiname01.sql_Datum.sql“. Wie parse
ich den Dateinamen ohne Extension daraus?

Hi Sancho,
siehe meine weiter Antwort oben.

fname=filename\_xyz.sql
fname\_ohne\_ext=${fname%.\*}
echo $fname\_ohne\_ext

gruss
bernhard

Mahlzeit,

wie geht denn sowas?

Zum Beispiel so:

C:\Texte\Sancho\>for %i in (\*.txt) do echo Laufwerk: %~di Pfad: %~pi Dateiname: %~ni Erweiterung: %~xi

C:\Texte\Sancho\>echo Laufwerk: C: Pfad: \Texte\Sancho\ Dateiname: drucker Erweiterung: .txt
Laufwerk: C: Pfad: \Texte\Sancho\ Dateiname: drucker Erweiterung: .txt

C:\Texte\Sancho\>echo Laufwerk: C: Pfad: \Texte\Sancho\ Dateiname: efo~1 Er weiterung: .txt
Laufwerk: C: Pfad: \Texte\Sancho\ Dateiname: efo~1 Erweiterung: .txt

C:\Texte\Sancho\>echo Laufwerk: C: Pfad: \Texte\Sancho\ Dateiname: NoName02 Erweiterung: .txt
Laufwerk: C: Pfad: \Texte\Sancho\ Dateiname: NoName02 Erweiterung: .txt

C:\Texte\Sancho\>echo Laufwerk: C: Pfad: \Texte\Sancho\ Dateiname: NoName03 Erweiterung: .txt
Laufwerk: C: Pfad: \Texte\Sancho\ Dateiname: NoName03 Erweiterung: .txt

C:\Texte\Sancho\>

Und vor allen Dingen: wo findet man solche Infos??

Gib in der Kommandozeile einfach for /? ein! Ansonsten im Index der Windows-Hilfe unter Befehlsreferenz schauen, da sind alle Kommandos aufgelistet.
Das Ganze geht übrigens erst ab Windows 2000.

Ich kann mir vorstellen, was du meinst - such mal unter
String-Operations in der ksh/bash manpage (wenigstens die
DateiNAMENSmanipulationen sollten sich damit machen lassen…)

Alles klar, hab ich gefunden!

Gruß

Sancho