Ich habe ein Verzeichnis mit diesen Dateien:
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_071002.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
Die Dateien unterscheiden sich nur im Datum, da mehrere Dateien mit dem gleichen Namensteil ("string_name"_YYMMDD_HHMMSS.tgz) vorhanden sein können.
Ich brauche ein Skript, das je nach Typ nur die letzte Version der Datei kopiert.
Beispiel:
string_name1_20160913_194047.tgz.
string_name1_20160913_194043.tgz.
Es sollte nur string_name1_20160913_194047.tgz kopiert werden.
Und machen Sie das für alle anderen Dateitypen ...
Im Moment kopiere ich manuell:
scp username@host:/tmp/string_name1_20160913_194047.tgz /home/config/
Ich freue mich über jeden Beitrag hierzu.
Antwort1
Mit 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
Wenn user
die Login-Shell von eingeschaltet host
ist zsh
, können Sie es wie folgt vereinfachen:
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 -
Die Idee ist, dass wir die Liste der Dateien in umgekehrter Reihenfolge abarbeiten ( (On)
) und die Datei auswählen, wenn der vorherige Teil des Dateinamens _*_*
noch nicht vorgekommen ist.
Die Dateien werden mithilfe von übertragen tar
, was auch den Vorteil hat, dass alle Metadaten der Dateien übertragen werden.
(sehenWie verwendet man assoziative Arrays sicher in arithmetischen Ausdrücken?warum wir hier let
anstelle von verwenden ((...))
).