Comment sélectionner le fichier le plus récent en fonction de la date dans le nom de fichier

J’ai une liste de fichiers

- backups/ - backup.2017-08-28.zip - backup.2017-08-29.zip - backup.2017-09-2.zip 

Je voudrais pouvoir télécharger le plus récent vers un serveur que je peux faire avec la commande:

dobackup ~/backups/backup.2017-09-2.zip

Mes questions sont: Dans un fichier .sh (pour que je puisse démarrer une tâche automatisée / cron pour cela), comment puis-je obtenir le dernier nom de fichier pour exécuter cette commande?

Limitation: je dois utiliser la date sur le nom de fichier, pas les métadonnées de modification.

Ajout de quelques fichiers supplémentaires:

 backup.2017-08-28.zip backup.2017-08-29.zip backup.2017-09-10.zip backup.2017-09-2.zip backup.2017-09-28.zip backup.2017-09-3.zip 

Que diriez-vous de quelque chose comme ça, quoique accordé, un peu compliqué:

 ls -1 backup*zip | sed 's/-\([1-9]\)\./-0\1\./g' | sort [-r] | sed 's/-0\([1-9]\)\./-\1\./g' 
  • sed recherche un match comme -[0-9].
  • les parens échappés / correspondants – \( et \) désignent un motif que nous voulons référencer dans la partie de remplacement
  • le nouveau motif sera -0\1. où le \1 est une référence au premier motif enveloppé dans échappé / correspondant parens (c’est-à-dire que \1 sera remplacé par le seul chiffre correspondant à [0-9] )
  • notre période ( . ) est échappée pour s’assurer qu’elle est gérée comme une période littérale et non considérée comme un caractère générique à une seule position
  • à ce stade, la construction ls/sed a produit une liste de fichiers avec des jours à 2 chiffres
  • nous courons par sort (ou sort -r ) selon les besoins
  • puis exécutez les résultats via sed pour les reconvertir en un jour à chiffre unique pour les jours commençant par 0
  • à ce stade, vous pouvez utiliser une head ou une tail pour supprimer la première / dernière ligne en fonction du sort / sort -r vous avez utilisé

En cours d’exécution sur les fichiers d’exemple:

 $ ls -1 backup*zip | sed 's/-\([1-9]\)\./-0\1\./g' | sort | sed 's/-0\([1-9]\)\./-\1\./g' backup.2017-08-28.zip backup.2017-08-29.zip backup.2017-09-2.zip backup.2017-09-3.zip backup.2017-09-10.zip backup.2017-09-28.zip # reverse the ordering $ ls -1 backup*zip | sed 's/-\([1-9]\)\./-0\1\./g' | sort -r | sed 's/-0\([1-9]\)\./-\1\./g' backup.2017-09-28.zip backup.2017-09-10.zip backup.2017-09-3.zip backup.2017-09-2.zip backup.2017-08-29.zip backup.2017-08-28.zip 

Vous pouvez le sortinger sur le 2ème champ délimité par un point:

 printf '%s\n' backup.* | sort -t '.' -k2,2r | head -1 backup.2017-09-2.zip