У меня есть каталог с этими файлами:
app_conf.jboss.имя_хоста_приложения_20160913_191141.tgz app_conf.jboss.имя_хоста_приложения_20160913_194047.tgz app_conf.провайдер.имя_хоста_приложения_20160913_194044.tgz app_conf.провайдер.имя_хоста_приложения_20160928_071002.tgz app_conf.развертывания.ear.имя_хоста_приложения_20160913_194047.tgz app_conf.развертывания.ear.имя_хоста_приложения_20160915_071005.tgz app_conf.bin.jboss_кластер.имя_хоста_приложения_20160913_194044.tgz app_conf.bin.jboss_cluster.имя_хоста_приложения_20160913_194047.tgz app_conf.bin.conf.имя_хоста_приложения_20160913_194043.tgz app_conf.bin.conf.имя_хоста_приложения_20160913_194047.tgz
Файлы различаются только по дате, поскольку может существовать несколько файлов с одинаковой частью имени ("string_name"_YYMMDD_HHMMSS.tgz)
Мне нужен скрипт, который копирует только последнюю версию файла в зависимости от вашего типа.
Пример:
string_name1_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
оболочка входа в систему 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
вместо ((...))
здесь).