ViaThinkSoft CodeLib
This article is in:
CodeLib → Programming aids → Perl
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:
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
ViaThinkSoft Gründer