シンボリック リンクを作成するスクリプトの作成について支援が必要です。以下は、バックグラウンドで実行しているスクリプトです。
#!/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
ここで、このスクリプトでさらにいくつかのタスクを実行したいと思います。
- すでにリンクされているフォルダーと
「old.」プレフィックスが付いたフォルダーは無視します。 メイン フォルダーが $SOURCE で使用できない場合は、$DEST からシンボリック リンクを削除します。
このスクリプトにこれらの機能を追加するのにご協力ください。 ありがとうございます。
答え1
-exec ...
これは予想以上に面倒かもしれませんが、この部分を別のスクリプトとして書き直します。このスクリプトif [ -h "$DEST/$1" ] ...
では、1 つの入力パラメータ (シンボリックリンク先のディレクトリ名) を取得し、シンボリックリンクがすでに存在するかどうか (例 )、必要に応じて、正しい場所に解決されるかどうか (例) を確認しますif [ $(readlink $DEST/$1) == $SOURCE/$1 ] ...
。両方の条件が満たされている場合は、ファイルをスキップし、そうでない場合はシンボリックリンクが (再) 作成されます。
次に、次のように exec クラスでこのスクリプトを呼び出します。
find $SOURCE -maxdepth 1 -type f -not -name "old.**" -exec make-symlink.sh {} \;
さらにいくつかの点:
find
代わりに置換されるファイル名{}
含まれるもの$SOURCE
: たとえば、あなたの場合、最終的なexec
コマンドは次のようになります:ln -s -- /home/user/www/public /var/www/home/user/www/public
。 を使用してこの問題を解決しますbasename
。一部のシステム (OS X) では、$SRC ディレクトリ自体がディレクトリ検索のリストに含まれます
find
。これはおそらく望ましくない結果です。find
出力の最初の行を削除するか、句を追加してこの問題を解決してください-not -name $(basename $SOURCE)
。
お役に立てれば。