2 つの異なるフォルダーのフォルダー/シンボリック リンク名を比較するスクリプトを作成するにはどうすればよいでしょうか?

2 つの異なるフォルダーのフォルダー/シンボリック リンク名を比較するスクリプトを作成するにはどうすればよいでしょうか?

シンボリック リンクを作成するスクリプトの作成について支援が必要です。以下は、バックグラウンドで実行しているスクリプトです。

#!/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)

お役に立てれば。

関連情報