根据文件名及其名称的日期比较复制远程文件的脚本

根据文件名及其名称的日期比较复制远程文件的脚本

我有一个包含这些文件的目录:

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_07100 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_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的登录 shellhostzsh,则可以将其简化为:

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而不是在((...))这里)。

相关内容