web-dev-qa-db-fra.com

Renommer et convertir des dates dans un nom de fichier sans extension de fichier

Mon ensemble de fichiers est nommé en fonction du fuseau horaire GMT. J'ai renommé et converti tous les fichiers avec succès dans le fuseau horaire requis en suivant les étapes suivantes.

1. Ce code supprime toutes les extensions de fichier qui sont .gif rename "s/.gif//g" *

2. Ce code convertit et renomme tous les fichiers for f in *; do mv -v -- "$f" "$(date -d "$f" '+%Y%m%d%H%M')"; done

  • Exemple de conversion: ‘15Z29Aug2017’ -> ‘201708292030’

Malheureusement, je dois à nouveau définir l'extension .gif pour tous les fichiers à l'aide de for f in *; do mv "$f" "$f.gif"; done

Comment puis-je ignorer la suppression de l'extension de fichier en modifiant mon code à l'étape 2?

Étape 2 tirée de: Comment puis-je convertir par lots les noms de dossier d'un format de date à un autre

2
csheth

Tout ce dont vous avez besoin est de retirer .gif de $f et le remettre sur:

for f in *; do mv -v -- "$f" "$(date -d "${f%%.gif}" '+%Y%m%d%H%M')".gif; done

${f%%.gif} prend la variable f et supprime la dernière (d'où # deux fois) occurrence de .gif dedans, donc même un nom de fichier étrange comme 1.gif2.gif n'obtiendrait que son dernier .gif supprimé. Cette fonctionnalité étonnante est appelée Extension des paramètres de Bash et lorsque vous la recherchez sous ce nom, vous pouvez tout lire sur son pouvoir éblouissant, e. g. sur cette FAQ Bash - il est capable de bien plus!

4
dessert