[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