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

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

以下のファイルを含むディレクトリがあります:

app_conf.jboss.app_hostname_20160913_191141.tgz app_conf.jboss.app_hostname_20160913_194047.tgz app_conf.provider.app_hostname_20160913_194044.tgz app_conf.provider.app_hostname_20160928_071002.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_194043.tgz app_conf.bin.conf.app_hostname_20160913_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代わりにを使用している理由については、((...))ここを参照してください。

関連情報