次のファイルを含むディレクトリがあります。
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
ここで代わりに使用する理由((...))
)。