web-dev-qa-db-fra.com

Comment créer des noms de fichiers numérotés séquentiellement dans Bash?

J'ai besoin d'un script qui créera un fichier avec le fichier suivant dans une séquence. Chaque exécution du script ne doit créer qu'un seul fichier et le script pourrait être exécuté zéro ou plusieurs fois à n'importe quel jour. Les fichiers doivent être nommés d'après la date actuelle au format %y%m%d avec le deuxième fichier ayant -01 a annexé, le troisième fichier à créer à une date donnée aurait -02 etc. Par exemple:

20170125.txt  // first file create on the day.
20170125-01.txt // 2nd file
20170125-02.txt // 3rd file

Jusqu'à présent, j'ai ce script Super Basic qui crée mon premier fichier quotidien, mais je suis exclu sur la manière de faire la numérotation incrémentielle après cela.

#! /bin/bash

DATE=`date +%Y%m%d`
touch "$DATE.txt"
7
Greg B
today=$( date +%Y%m%d )   # or: printf -v today '%(%Y%m%d)T' -1
number=0

fname=$today.txt

while [ -e "$fname" ]; do
    printf -v fname '%s-%02d.txt' "$today" "$(( ++number ))"
done

printf 'Will use "%s" as filename\n' "$fname"
touch "$fname"

today obtient la date d'aujourd'hui et nous initialisons notre compteur, number, à zéro et créez le nom de fichier initial comme date avec un .txt suffixe.

Ensuite, nous testons pour voir si le nom de fichier existe déjà. Si c'est le cas, incrémentez le compteur et créez un nouveau nom de fichier à l'aide de printf. Répétez la répétition jusqu'à ce que nous n'avions plus de collision de nom de fichier.

La chaîne de format pour le printf, %s-%02d.txt, signifie "une chaîne suivie d'un tiret littéral suivi d'un entier à deux chiffres rempli de zéro et de la chaîne .txt ". La chaîne et l'entier sont donnés comme d'autres arguments à printf.

Les -v fname met la sortie de printf dans la variable fname.

Le touch est juste là pour tester.

Cela générera des noms de fichiers comme

20170125.txt
20170125-01.txt
20170125-02.txt
20170125-03.txt

etc. sur les courses suivantes.

12
Kusalananda

Vous pouvez utiliser seq. Il peut créer des séquences numériques de différentes manières, mais vous devez connaître le nombre total de fichiers.

E.g: Vous pouvez essayer seq -w 1 10. Cela créera la séquence de 01 à 10, alors vous pouvez l'inclure dans A pour la boucle:

for i in `seq -w 1 10`
do
  touch `date +%Y%m%d`-$i.txt
done

addendum pour votre dernière mise à jour de questions :

Pour accomplir ce que vous voulez facilement, vous pouvez créer le premier fichier avec -0. Lors des exécutions ultérieures, vous devez prendre la liste des fichiers, sort eux, prenez la dernière, cut it it de la dernière - et obtenir le numéro, incrémenter et créer le nouveau fichier avec ce numéro.

Le rembourrage aura cependant besoin de plus de travail.

3
bayindirh

Quelque chose comme...

#!/bin/bash
DATE=$(date +%Y%m%d)
filename="${DATE}.txt"
num=0
while [ -f $filename ]; do
    num=$(( $num + 1 ))
    filename="${DATE}-${num}.txt"
done
touch $filename

...devrait marcher. Cela crée des noms de fichiers du format Date-1.txt, date-2.txt, date-3,txt, ..., date-10.txt, date-11.txt, etc. Changer qu'en date-01.txt etc est laissé comme un exercice au lecteur :)

Notez que vous devez probablement aussi vous assurer que vous n'appelez pas le script plus d'une fois parallèlement, sinon vous aurez plus d'un script modifiant les choses.

Note latérale: Des charges de logiciels permettent de gérer plusieurs versions d'un fichier. Ils s'appellent "Systèmes de contrôle de version" (VCS) ou "Gestion de la commande Source" (SCM). Git et Subversion sont assez populaires. Je vous suggère de les vérifier, plutôt que de réimplémenter votre propre :-)

3
Wouter Verhelst

Si vous avez déjà la valeur de comptoir dans une variable d'environnement, vous pouvez utiliser Bash Arithmetic pour générer le nom de fichier .... La valeur $ ((((CTR + = 1)) augmente la valeur du CTR et substitue la valeur dans la chaîne de nom de fichier.

$ ctr=0
$ touch file-$(( ctr+=1 ))-name.txt
$ touch file-$(( ctr+=1 ))-name.txt
$ touch file-$(( ctr+=1 ))-name.txt
$ touch file-$(( ctr+=1 ))-name.txt
$ ls
file-1-name.txt  file-2-name.txt file-3-name.txt  file-4-name.txt
0
MikeW