Go to English page

ViaThinkSoft CodeLib

Dieser Artikel befindet sich in der Kategorie:
CodeLibProgrammierhilfenPerl

Erstellt man unter Linux ein Backup von /etc, werden symbolische Links (Symlinks) leider standardmäßig dereferenziert (entgegen der dokumentierten Option "-h", die angeblich erst Symlinks auflöst).
Dabei tritt beim direkten Entpacken in das Verzeichnis /etc das Problem auf, dass Dateieinträge, die vorher Symlinks waren, nun zu echten Dateien werden. Insbesondere in den Verzeichnissen /etc/rc*.d macht sich dies bemerkbar, da einige Pakete - wenn sie installiert werden sollen - bei der Installation abbrechen, da die korrespondierenden Einträge in /etc/rc*.d als Datei erkannt werden.
Um nun alle Einträge innerhalb /etc/rc*.d wieder als symbolische Links auf die entsprechenden Dateien in /etc/init.d zu deklarieren, hilft folgendes Perl-Skript:
#!/bin/perl

@dirs = ('rc0.d', 'rc1.d', 'rc2.d', 'rc3.d', 'rc4.d', 'rc5.d', 'rc6.d', 'rcS.d');
foreach $dir (@dirs) {
  opendir(DIR, "/etc/".$dir);
  @files = readdir(DIR);
  closedir(DIR);

  foreach $file (@files) {
    next if ($file eq "." or $file eq "..");
    $pos = substr($file, 0, 3);
    $target = substr($file, 3);
    if (-e "/etc/init.d/".$target) {
      #print "[$pos] [$target]\n";
      print "UNLINK /etc/".$dir."/".$pos.$target."\n";
      unlink("/etc/$dir/$pos$target");
      print "CREATE LINK: cd /etc/$dir/; ln -s ../init.d/$target $pos$target\n";
      `cd /etc/$dir/; ln -s ../init.d/$target $pos$target;`;
    }
  }
}
Victor-Phillip Negoescu
ViaThinkSoft Gründer