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].
\(
et \)
désignent un motif que nous voulons référencer dans la partie de remplacement -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]
) .
) 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 ls/sed
a produit une liste de fichiers avec des jours à 2 chiffres sort
(ou sort -r
) selon les besoins sed
pour les reconvertir en un jour à chiffre unique pour les jours commençant par 0
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