[linux-l] Dateien automatisch unbenennen
Mike Dornberger
Mike.Dornberger at gmx.de
Mo Mai 14 20:25:07 CEST 2007
On Mon, May 14, 2007 at 01:29:15AM +0200, Sven Guckes wrote:
> * Leander Sukov <leander.sukov at leander-sukov.de> [2007-05-14 00:45]:
> > for i in *.lock; do x=`echo $i | cut -f 1 -d .`; mv $i $x; done
> >
> > ist zwar die Unbenennung drin, aber nicht die Altersabfrage.
> > Ich will aber nur Dateien umbennen, die seit 120 Minuten
> > *.lock heißen. Und ich komme nicht auf die Lösung :-(
>
> for file in `find . -maxdepth 1 -daystart -ctime 120 -name '*.lock' `; do ...
>
> untested.
find -print0 | perl -n0e 'chomp; if (/(.*)\.lock$/) {print "renaming $_ to \
$1:"; rename $_, $1 and print " done." or print " Could not rename $_: \
$!"; print "\n"}'
Tested. :)
(In find noch die entsprechenden Tests einbauen: find <-tests> -print0)
Vorteile:
- ist sicher, auch wenn Dateinamen ein Newline oder Leerzeichen haben
(sollte man immer bedenken, wenn man was als root macht, wenn ich das
richtig verstanden hatte, sollte das ganze ja als Cronjob laufen)
- sagt, wenn ein rename nicht geklappt hat
- in Svens Variante kann es zu Fehlern kommen, wenn die Zeile durch die
Command Substitution zu lang wird (konnte ich allerdings nicht
provozieren)
- die Shell fork()t für jeden Dateinamen ein mv im do ... done Block, die
find | perl - Variant hat nur 2 laufende Prozesse
Nachteile:
- benötigt ein find, daß das Ende des gefundenen Namens mit ASCII NUL
kennzeichnen kann
- benötigt ein Perl, daß des Input-Separator auf ASCII NUL setzen kann
(sollte jedes hinreichend aktuelles perl haben, denke ich)
- die Ausgabe der Dateinamens im perl-Teil durch print $_ kann das Terminal
stören
- Wenn es so als Cronjob läuft, bekommst du ständig E-Mails mit den Files
die umbenannt wurden, willst du nur über Fehler informiert werden, dann
muß der {}-Block
{rename $_, $1 or print "Could not rename $_ to $1: $!\n"} lauten.
Gruß,
Mike
Mehr Informationen über die Mailingliste linux-l