ファイル名と名前の日付比較に基づいてリモートファイルをコピーするスクリプト

ファイル名と名前の日付比較に基づいてリモートファイルをコピーするスクリプト

次のファイルを含むディレクトリがあります。

app_conf.jboss.app_hostname_20160913_191141.tgz app_conf.jboss.app_hostname_20160913_194047.tgz app_conf.provider.app_hostname_20160913_194042 _071 00 2.tgz app_conf.deployments.ear.app_hostname_20160913_194047.tgz app_conf.deployments.ear.app_hostname_20160915_071005.tgz app_conf. bin 。 jboss_cluster.app_hostname_20160913_194044.tgz app_conf.bin.jboss_cluster.app_hostname_20160913_194047.tgz app_conf.bin.conf.app_hostname_20160913_19 09 13 _194047.tgz

同じ名前部分( "string_name"_YYMMDD_HHMMSS.tgz)を持つ複数のファイルがある可能性があるため、これらのファイルは日付によってのみ異なります。

あなたのタイプに応じて、ファイルの最後のバージョンのみをコピーするスクリプトが必要です。

例:

文字列名1_20160913_194047.tgz。

文字列名1_20160913_194043.tgz。

string_name1_20160913_194047.tgzのみをコピーする必要があります。

他のすべての種類のファイルに対してこれを行います。

これで手動でコピーします。

scp username@host:/tmp/string_name1_20160913_194047.tgz /home/config/

これに関するご意見をお寄せいただきありがとうございます。

ベストアンサー1

そしてzsh

cd /home/config && ssh user@host << \EOF | tar xpf -
zsh -c '
  cd /tmp || exit
  typeset -A seen; files=()
  for f (app_conf*_*_*.tgz(On)) {let '\''seen[${f%_*_*}]++'\'' || files+=($f)}
  tar cf - $files'
EOF

userログインシェルがhostある場合は、zsh次のように単純化できます。

cd /home/config && ssh user@host '
  cd /tmp || exit
  typeset -A seen; files=()
  for f (app_conf*_*_*.tgz(On)) {let '\''seen[${f%_*_*}]++'\'' || files+=($f)}
  tar cf - $files' | tar xpf -

アイデアは、ファイルリストを逆順に処理し、(On)ファイル名の前の部分がまだ表示されていない場合は_*_*ファイルを選択することです。

これを使用してファイルを転送すると、tarすべてのファイルのメタデータを転送できるという利点もあります。

(望むより算術式で連想配列を安全に使用するには?letここで代わりに使用する理由((...)))。

おすすめ記事