我有一個包含這些文件的目錄:
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
的登入 shellhost
是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
而不是在((...))
這裡)。