Trouver plus haut le nom de fichier numéro dans un répertoire où les noms commencent par les chiffres

StackOverflow https://stackoverflow.com/questions/1587059

  •  22-09-2019
  •  | 
  •  

Question

J'ai un répertoire avec des fichiers qui ressemblent à ceci:

001_something.php  002_something_else.php
004_xyz.php        005_do_good_to_others.php

Je veux finalement créer un nouveau fichier PHP vide dont le nom commence par le numéro suivant dans la série.

LIST=`exec ls $MY_DIR | sed 's/\([0-9]\+\).*/\1/g' | tr '\n' ' '`

Le code précédent me donne une chaîne comme ceci:

LIST='001 002 004 005 '

Je veux saisir cette 005, incrément par un, et ensuite utiliser ce numéro pour générer le nouveau nom de fichier. Comment puis-je faire dans BASH?

Était-ce utile?

La solution

$ LIST=($LIST)
$ newfile=`printf %03d-whatever $((10#${LIST[${#LIST}]}+1))`
$ echo $newfile
006-whatever

Alors, c'est spécifique à bash. Ci-dessous un any-shell POSIX-y compris-bash solution, quoique j'imagine quelque chose de plus simple est possible.

$ cat /tmp/z
f () {
    eval echo \${$#} | sed -e 's/^0*//'
}
LIST='001 002 004 005 '
newname=`printf %03d-whatever $(($(f $LIST) + 1))`
echo $newname
$ sh /tmp/z
006-whatever
$ 

Autres conseils

Avez-vous besoin de la totalité de la liste?

Dans le cas contraire

LAST=`exec ls $MY_DIR | sed 's/\([0-9]\+\).*/\1/g' | sort -n | tail -1`

vous donnera juste la partie 005 et

printf "%03d" `expr 1 + $LAST`

affichera le numéro suivant dans la séquence.

En utilisant uniquement des outils standard, ce qui suit vous donnera le préfixe du nouveau fichier (006):

ls [0-9]* | sed 's/_/ _/' | sort -rn | awk '{printf "%03d", $1 + 1; exit}'

Cela semble être plus simple.

ls [0-9]* | sort -rn | awk '{FS="_"; printf "%03d_new_file.php\n",$1+1;exit}'

Rapide, sans sous-shell et sans boucle (poignées également les noms de fichiers avec des espaces) *:

list=([0-9]*)
last=${list[@]: -1}
nextnum=00$((10#${last%%[^0-9]*} + 1))
nextnum=${nextnum: -3}
touch ${nextnum}_a_new_file.php

Étant donné votre exemple les fichiers de la sortie serait:

006_a_new_file.php
$ for file in *php; do last=${file%%_*} ; done
$ newfilename="test.php"
$ printf "%03d_%s" $((last+1)) $newfilename
006_test.php

Je vous laisse faire la création du nouveau fichier

  1. touch "newfile_$(printf "%03d" $(echo $(ls 00?_*.php|sed 's/_.*//'|sort -rn|head -1)+1|bc))"
    

    2.

    num=$(ls 00?*.php|sed 's/.*//'|sort -rn|head -1) 
    touch $(printf "newfile_%03d" $((num+1)))

Je posterai cette réponse à proposer une solution minimale à la question de base « Trouver le nom de fichier numéro le plus élevé dans un répertoire où les noms commencent par les chiffres »:

ls -1 "$MyDir" | sort -hr | head -n 1

La première déclaration met les fichiers dans MyDir comme un liners avec l'option -1. Ceci est canalisé vers la fonction de tri qui trie par ordre numérique humain avec -h et dans l'ordre inverse (nombre le plus élevé en premier) avec l'option -r. Ceci est canalisé vers la fonction de tête qui fournit juste les résultats les plus haut -n (1 dans l'exemple). La réponse considère l'ordre de tri numérique humain à savoir 221 est supérieur à 67. Il est une solution shell POSIX si hautement compatible.

Voici une solution (vous avez besoin bc):

#!/bin/bash

LIST='001 002 008 005 004 002 '
a=0

for f in $LIST
do
    t=$(echo $f + 1|bc)
    if [ $t -ge $a ]
    then
        a=$t
    fi
done

printf "%03d\n" $a
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top