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
find
anstelle von{}
wird beinhalten$SOURCE
: In Ihrem Fallexec
sieht 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 verwendenbasename
.Auf einigen Systemen (OS X) wird das Verzeichnis $SRC selbst in die Liste der
find
gefundenen Verzeichnisse aufgenommen. Dies ist wahrscheinlich nicht das, was Sie wollen. Lösen Sie dieses Problem, indem Sie die erste Ausgabezeile entfernenfind
oder eine Klausel hinzufügen-not -name $(basename $SOURCE)
.
Hoffe das hilft.