根據檔案名稱及其名稱的日期比較複製遠端檔案的腳本

根據檔案名稱及其名稱的日期比較複製遠端檔案的腳本

我有一個包含這些文件的目錄:

app_conf.jboss.app_hostname_20160913_191141.tgz app_conf.jboss.app_hostname_20160913_194047.tgz app_conf.provider.app_hostname_20160913_194014890014001 0 2.tgz app_conf.deployments.ear.app_hostname_20160913_194047.tgz app_conf.deployments.ear.app_hostname_20160915_071005.tgz app_conf.bin 。 _194047.tgz

這些檔案僅按日期變化,因為可能存在多個具有相同名稱部分的檔案(“string_name”_YYMMDD_HHMMSS.tgz)

我需要一個腳本,僅根據您的類型複製文件的最後版本。

例子:

字串名稱1_20160913_194047.tgz。

string_name1_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而不是在((...))這裡)。

相關內容