Finden Sie den höchsten nummerierten Dateinamen in einem Verzeichnis, in dem Namen mit Ziffern beginnen

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

  •  22-09-2019
  •  | 
  •  

Frage

Ich habe ein Verzeichnis mit Dateien, die so aussehen:

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

Ich möchte letztendlich eine neue, leere PHP -Datei erstellen, deren Name mit der nächsten Nummer in der Serie beginnt.

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

Der vorhergehende Code gibt mir eine solche Zeichenfolge:

LIST='001 002 004 005 '

Ich möchte diesen 005 greifen, um eins inkrementieren und dann diese Nummer verwenden, um den neuen Dateinamen zu generieren. Wie mache ich das in Bash?

War es hilfreich?

Lösung

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

Das ist also bashspezifisch. Unten ist a Any-Posix-Shell-including-Bash Lösung, ich stelle mir vor, dass etwas Einfacheres möglich ist.

$ 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
$ 

Andere Tipps

Benötigen Sie die gesamte Liste?

Wenn nicht

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

wird Ihnen nur den 005 Teil geben und

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

Drucken Sie die nächste Nummer in der Sequenz.

Wenn Sie nur Standard -Tools verwenden, erhalten Sie im Folgenden das Präfix für die neue Datei (006):

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

Dies scheint einfacher zu sein.

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

Schnell, subschellfrei und loopfrei (behandelt auch Dateinamen mit Leerzeichen)*:

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

Angesichts Ihrer Beispieldateien wäre die Ausgabe:

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

Ich überlasse es Ihnen, die Erstellung neuer Datei zu erstellen

  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)))

Ich poste diese Antwort, um eine minimale Lösung für die Kernfrage zu schlagen "Finden Sie den höchsten nummerierten Dateinamen in einem Verzeichnis, in dem Namen mit Ziffern beginnen":

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

In der ersten Anweisung wird die Dateien in MyDir als einen Liner mit der Option -1 veröffentlicht. Dies wird in die Sortierfunktion geleitet, die in menschlicher Reihenfolge mit -h und in umgekehrter Reihenfolge (zuerst höchste Zahl) mit -R sortiert. Dies wird an die Kopffunktion geleitet, die nur die meisten Ergebnisse -N -Top -Ergebnisse liefert (1 im Beispiel). Die Antwort berücksichtigt die menschliche numerische Sortierreihenfolge, dh 221 ist höher als 67. Sie ist eine POSIX -Shell -Lösung, die so hoch kompatibel ist.

Hier ist eine Lösung (Sie brauchen 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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top