Wie schreibe ich ein Skript, das Ordner-/symbolische Linknamen aus zwei verschiedenen Ordnern vergleicht?

Wie schreibe ich ein Skript, das Ordner-/symbolische Linknamen aus zwei verschiedenen Ordnern vergleicht?

Ich brauche Hilfe beim Schreiben eines Skripts zum Erstellen symbolischer Links. Hier ist ein Skript, das ich im Hintergrund ausgeführt habe.

#!/bin/bash
SOURCE="/home/$USER/www"
DEST="/var/www"
while true; do
    find $SOURCE -maxdepth 1 -type d -not -name "old.**" -exec ln -s -- {} "$DEST"/{} \;
    find $DEST -maxdepth 1 -type l -exec test ! -e {} \; -delete
sleep 30
done

Jetzt möchte ich, dass dieses Skript noch ein paar weitere Aufgaben ausführt.

  • Ignorieren Sie bereits verknüpfte Ordner und Ordner mit dem Präfix „alt.“ .
  • Entfernen Sie den symbolischen Link aus $DEST, wenn der Hauptordner in $SOURCE nicht verfügbar ist.

Bitte helfen Sie mir, diese Funktionalität in dieses Skript einzufügen. Danke.

Antwort1

Ich weiß, dass dies umständlicher sein könnte, als Sie erwarten, aber ich würde den -exec ...Teil als separates Skript neu schreiben, das einen Eingabeparameter erhält (den Verzeichnisnamen, auf den der symbolische Link erstellt werden soll) und dann prüft, ob der symbolische Link bereits vorhanden ist (z. B. if [ -h "$DEST/$1" ] ...) und ob er ggf. an einen korrekten Speicherort aufgelöst wird (z. B. ) if [ $(readlink $DEST/$1) == $SOURCE/$1 ] .... Wenn beide Bedingungen erfüllt sind, überspringen wir die Datei, andernfalls wird der symbolische Link (neu) erstellt.

Anschließend rufst du dieses Skript in der Exec-Klasse wie folgt auf: find $SOURCE -maxdepth 1 -type f -not -name "old.**" -exec make-symlink.sh {} \;

Ein paar weitere Punkte:

  • Die Dateinamen, die findanstelle von{} wird beinhalten$SOURCE: In Ihrem Fall execsieht der endgültige Befehl beispielsweise so aus: ln -s -- /home/user/www/public /var/www/home/user/www/public. Lösen Sie dieses Problem, indem Sie verwenden basename.

  • Auf einigen Systemen (OS X) wird das Verzeichnis $SRC selbst in die Liste der findgefundenen Verzeichnisse aufgenommen. Dies ist wahrscheinlich nicht das, was Sie wollen. Lösen Sie dieses Problem, indem Sie die erste Ausgabezeile entfernen findoder eine Klausel hinzufügen -not -name $(basename $SOURCE).

Hoffe das hilft.

verwandte Informationen