Script Bash pour créer le fichier suivant le plus élevé

Ma tâche consiste à écrire un script qui crée le fichier immédiatement supérieur dans un répertoire particulier. J’ai réussi à sortinger les fichiers dans le répertoire afin que le script génère le nom de fichier le plus élevé. Par exemple, à partir des fichiers red_01 red_02 red_03 il red_04

Ma tâche suivante consiste à créer le fichier le plus élevé. Comment lui faire créer le fichier red_04 ? Dois-je stocker le nombre dans une variable et l’incrémenter?

Cela fera ce dont vous avez besoin. Ajustez les chemins pour tous les chemins dont vous avez besoin, vous pouvez également utiliser des variables et les parsingr dans le script. Mais oui, vous pouvez l’ajuster vous-même;)

 #!/bin/bash #count your existing files NUMBERATM=`find ./ -type f -name "red_*" | wc -l` #add +1 to create the next higher file NUMBERATM=$((NUMBERATM+1)) #check if it's below 10 since you need the 0 infront of it if [ $NUMBERATM -lt "10" ]; then var=0$NUMBERATM else var=$NUMBERATM fi #create your file touch red_$var 

Sans parsingr ls ni find sortie et sans créer de fichiers supplémentaires, incrémenter uniquement le nom du dernier fichier (les autres fichiers peuvent porter des noms).

Pour compter les fichiers dans un répertoire:

 stat * --printf "%i\n" | wc -l 

Pour obtenir le dernier fichier:

 i=0; j=$(stat * --printf "%i\n" | wc -l); for k in *; do (( (j - ++i) < 1 )) && echo "$k"; done 

(( (j - ++i) < 1 )) teste le nombre de fois que la boucle a été exécutée et le compare au nombre de fichiers du répertoire. Il repose sur le fait que for boucles sur les fichiers de manière ordonnée.

Pour obtenir le nom du fichier suivant en supposant que le modèle name_{01..99}

 i=0 j=$(stat * --printf "%i\n" | wc -l) for k in *; do (( (j - ++i) < 1 )) && echo "${k%%_*}"_$(printf %02d "$(( ${k##*_} + 1 ))") done 

Pour créer le fichier:

 touch $(i=0; j=$(stat * --printf "%i\n" | wc -l); for k in *; do (( (j - ++i) < 1 )) && echo "${k%%_*}"_$(printf %02d "$(( ${k##*_} + 1 ))"); done) 

ou

 touch $( i=0 j=$(stat * --printf "%i\n" | wc -l) for k in *; do (( (j - ++i) < 1 )) && echo "${k%%_*}"_$(printf %02d "$(( ${k##*_} + 1 ))") done ) 

Parcourez les numéros et vérifiez si le fichier existe déjà. S’il existe, continuez avec la boucle; Si le fichier n’existe pas, créez-le.

 for n in $(seq -w 01 99); do [[ ! -f "red_${n}" ]] && { touch "red_${n}"; break; } done 

Changez en $(seq -w 001 999) ou plusieurs chiffres si nécessaire.

Remarque: Cela créera red_02 s’il est manquant, même s’il red_01 et red_03 .

Cela fonctionne même si des espaces sont présents et un événement si les nombres ne sont pas complétés dans les noms de fichiers

 #!/bin/bash highest=-1 IFS=" " for f in red_*; do num=$(echo $f| cut -d _ -f2) if [[ ! "$f" =~ red_[0-9]{1,2} ]];then #prevents failing because of #spaces or letters num=0 else num=$(printf %d "$((10#$num))"); #eliminate zero padding to prevent #interpretation as octal fi if [[ $num -gt "$highest" ]];then highest=$num fi done newfile=red_$(printf %02d $(($highest+1))) echo $newfile touch $newfile 

Vous pouvez recevoir à la fois le préfixe et la quantité de remplissage à zéro souhaitée dans la sortie en tant que parameters, en éliminant les littéraux “red_” et “02”.