openSUSE 11.3 – Aufräumarbeit nach einem Upgrade von openSUSE

Heute mal aus der Rubrik „Tipps und Tricks“. Habt ihr schon mal daran gedacht, dass nach einem Upgrade noch Altlasten von openSUSE 11.2 auf eurem openSUSE 11.3-System vorhanden sein können? Wenn nicht, dann ist jetzt der richtige Zeitpunkt das System aufzuräumen. ;-)

Man kann sich sehr einfach eine sortierte Liste (mittels RPM, grep und sort) über vorhandene „openSUSE 11.2“-Pakete in der Konsole ausgeben lassen:

rpm -qa --qf '%{name}-%{version}-%{release} -> %{distribution}\n' | grep -i -E 'openSUSE[_|-| ]11.2' | sort

Diese Liste zeigt teilweise auch das Repo der installierten Paketen an und man kann so die Pakete im OBS lokalisieren und erneut aktualisieren. Sobald man das erledigt hat, kann man nun die restlichen „openSUSE 11.2“-Pakete entfernen, die man bisher gar nicht auflösen konnte bzw. mit dem gleichen Paketnamen bereits eine neuere Version unter openSUSE 11.3 installiert wurde.

Wenn man ein Upgrade bzw. ein Update von openSUSE hinter sich hat, sollte man sich auch nach neueren Konfigurationsdateien umschauen, die aus logischen Gründen nicht ersetzt wurden (der Zweck ist, dass der laufende Betrieb nach der Installation nicht gestört werden darf und daher die Änderungen von Hand erledigt werden muss):

find /etc -iname "*.rpmnew"

Sind in der o.g. Liste einige Dateien vorhanden, die mit „rpmnew“ enden, so sollte man die Konfiguration von der älteren Datei in die neue Datei übertragen. Anschließend löscht man die ältere Datei und benennt die neuere Datei in den Namen der älteren Datei um (also ohne .rpmnew).

Beispiel:
/etc/php5/apache/php.ini <= ältere Datei /etc/php5/apache/php.ini.rpmnew <= neue Datei Optional: Unterschiede der Konfiguration anzeigen lassen:

diff -rup /etc/php5/apache/php.ini /etc/php5/apache/php.ini.rpmnew

Konfiguration manuell übertragen. Nachtrag: Die beiden Dateien sollten zur Bearbeitung (root-Rechte) mit einem Editor geöffnet werden und die jeweilige Konfigurationen rüberkopieren. Hat man hier keine Einstellung vorgenommen, kann man zum nächsten Schritt übergehen.
/etc/php5/apache/php.ini => /etc/php5/apache/php.ini.rpmnew

Abschließend die ältere Datei löschen und die neuere Datei umbenennen:

rm /etc/php5/apache/php.ini
mv /etc/php5/apache/php.ini.rpmnew /etc/php5/apache/php.ini

oder noch kürzer

mv -f /etc/php5/apache/php.ini{.rpmnew,}

Viel Spaß beim Aufräumen. ;-)

Linux – Dateinamen und/oder Verzeichnisse in Groß- oder Kleinschreibung umbenennen

Es gibt ein Kommandozeilen-Tool das Groß- oder Kleinschreibung wie auch in bestimmte Zeichensätze umbenennen bzw. konvertieren kann. Das Tool heißt convmv.

Unter openSUSE 11.x lässt sich das Tool sehr einfach in der Konsole installieren:

zypper in convmv

Wenn man alle Dateien und Verzeichnisse im aktuellen Verzeichnis in Kleinschreibung haben möchte, dann reicht dieser Befehl:

convmv --lower *

Wenn man aber alles in Großschreibung haben möchte, dann nimmt man die Option –upper anstatt –lower. Zur Vereinfachung bleibe ich in diesem kleinen HowTo bei der Kleinschreibung und gehe auf verschiedene Lösungswege ein.

Jedoch wird hier eine Liste mit den Änderungen ausgegeben. Somit kann man wunderbar verfolgen, wie das Tool bei der Umbenennung vorgeht.

Um die Umbenennung auch wirklich auszuführen, gibt man noch die Option –notest an:

convmv --lower --notest *

Wenn das Tool rekursiv durch alle Unterverzeichnisse arbeiten soll, dann fügen wir noch eine Option -r ein:

convmv -r --lower --notest *

Jetzt kommen wir mal zu einem Spezialfall. Wenn wir aber nur Dateinamen rekursiv durch alle Unterverzeichnisse umbenennen möchten, dann hilft uns in diesem Fall weitere Tools wie find und xargs:

find ./ -type f -print0 | xargs -r -0 convmv --lower

Erläuterung für find:
./ = In welchem Verzeichnis soll durchsucht werden (hier nur aktuelles)
-type f = Nur Dateien sollen berücksichtigt werden
-print0 = Jede Datei wird ein NULL-Zeichen als Trennzeichen angehängt, somit lassen sich die Dateiennamen bei der Übergabe an xargs besser auseinander halten

Erläuterung für xargs:
-r = nicht ausführen, wenn keine weiteren Argumente übergeben werden können (= leer)
-0 = NULL-Zeichen als Trennzeichen berücksichtigen.

Was ist mit dem schwierigsten Fall wie z.B. die Umbenennung von Verzeichnisnamen und das auch noch rekursiv durch alle Unterverzeichnisse? Nun man denkt einfach, dass man den o.g. Befehl -type f in -type d austauschen und ausführen kann. Spätestens bei der Umbenennung eines Unterverzeichnis dessen oberen Verzeichnisname sich geändert hat, würde das Vorhaben nur auf eine einzige Verzeichnistiefe beschränken. Alle darunterliegenden Verzeichnisse können somit nicht umbenannt werden.

Also verwenden wir ein etwas modifizierten Einzeiler und geben dem find die Option -depth mit, somit sollten die Verzeichnisse in korrekter Reihenfolge an convmv übergeben werden:

find ./ -depth -type d -print0 | xargs -r -0 convmv --lower --notest

Hinweis zum Tool find und der Option -exec:
Einige Linux-User verwenden statt xargs eher die Option -exec in find. Wobei ich vom Gebrauch der Option -exec expizit abraten würde. Ich verdeutliche es mal an einem Beispiel. Wenn find z.B. 5.000 Dateien findet, werden bei -exec auch 5.000 Prozesse hintereinander gestartet und das geht zu Lasten der System-Performance. Bei der Verwendung von xargs werden 5.000 Dateien als Argumente an das jeweilige Programm übergeben und benötigt nur 1 Prozess anstatt 5.000 Prozesse. ;-)