次のステップのスクリプトがあります。
- 1 lftpを使用してリモートサーバーをミラーリングします。
open ftps://'[name]':'[pwd]'@[remote_host]
set ssl:check-hostname no
mirror --delete-first --only-newer /ExchangeSets
/home/sandbox_autopilot/Exchangesets
exit
- 2 次に、 find コマンドを使用してファイル名の先頭に基づいてファイルをソートし、フォルダにコピーしました。
find /home/sandbox_autopilot/Exchangesets -iname '1R4*.000' -exec cp -u --target-directory /home/sandbox_autopilot/1R4/ {} \;
find /home/sandbox_autopilot/Exchangesets -iname '1R5*.000' -exec cp -u --target-directory /home/sandbox_autopilot/1R5/ {} \;
find /home/sandbox_autopilot/Exchangesets -iname '1R6*.000' -exec cp -u --target-directory /home/sandbox_autopilot/1R6/ {} \;
- 3 1R4、1R5、1R6フォルダ内のファイルに複数のGIS変更を適用しましたが、これは私の問題には関係ありません。
重要なもの:
- リモートサーバーをミラーリングした後、/home/sandbox_autopilot/Exchangesetsフォルダーのサブフォルダー名は4桁で始まり、最新のファイルを含むフォルダーは前のフォルダーよりも高い4桁で始まります(以下の例を参照)。
- /home/sandbox_autopilot/Exchangesets のフォルダ構造には、同じファイルの複数のバージョンがあります。 "find -exec cp"コマンドで要求された動作は、使用可能なファイルの最新バージョンをターゲットディレクトリに配置することです。
フォルダ/home/sandbox_autopilot/Exchangesets構造内の複数のファイルの例:
find . -name 1R65Y842.000
./5704b_[projectname]/ENC_ROOT/1R/6/1R65Y842/1R65Y842.000
./5721a_[projectname]/ENC_ROOT/1R/6/1R65Y842/1R65Y842.000
./5673b_[projectname]/ENC_ROOT/1R/6/1R65Y842/1R65Y842.000
./5618_[projectname]/ENC_ROOT/1R/6/1R65Y842/1R65Y842.000
./5802b_[projectname]/ENC_ROOT/1R/6/1R65Y842/1R65Y842.000
./5646a_[projectname]/ENC_ROOT/1R/6/1R65Y842/1R65Y842.000
注:[プロジェクト名]はすべて異なりますが、プライバシー保護のためにこの例では空白のままにしておきます。
問題:
"find -exec cp"コマンドは1R6フォルダの最新ファイルを提供しません。
私の考えにはそんなことが起きているようだ。
- 元のフォルダ構造では、ファイルの日付は "lftpミラー"コマンドによって正しく渡されます。したがって、最新のファイルの日付が最新です。
- "find -exec cp"コマンドがファイルを見つけてその1Rフォルダにコピーする場合。ファイルの日付は now() に設定されます。その後、「find -exec cp」コマンドが同じ名前の最新のファイルを見つけた場合、ターゲットディレクトリの日付は最新(now())で上書きする必要があるファイルのファイル日付なので、コピーされません。ターゲットディレクトリファイルにあるので、cpの-u機能を無駄にします。
私が検討している解決策:
- ファイルがターゲットディレクトリにコピーされたときにcpコマンドがファイルの日付を変更しないようにすることはできますか?それで、cp -uは正しい日付を評価し、最新バージョンのファイルをターゲットディレクトリに配置できますか?
- 実際のコピーを作成するのではなく、シンボリックリンクを使用すると便利ですか?
- 見つかったファイルのバージョンを評価し、最新バージョンのファイルに対してのみコピーコマンドを実行するオプションがありますか?
私の謙虚な要求:
私が正しい方向に進むのを助ける人がいますか?
答え1
cpコマンドは、タイムスタンプを含む属性を保存できます。最も簡単なアーカイブ方法:cp -a
すべてのプロパティを維持します。マニュアルから:
--preserve[=ATTR_LIST] preserve the specified attributes (default: mode,ownership,timestamps), if possible additional at‐ tributes: context, links, xattr, all
そして
-a, --archive same as -dR --preserve=all