BASH: Finden Sie höchste nummerierte Dateinamen in einem Verzeichnis, in dem Namen beginnen mit Ziffern (ls, sed)
Ich habe ein Verzeichnis mit Dateien, die wie folgt Aussehen:
001_something.php 002_something_else.php
004_xyz.php 005_do_good_to_others.php
Ich letztendlich wollen erstellen Sie eine neue leere PHP Datei, deren name beginnt mit der nächsten Zahl in der Reihe.
LIST=`exec ls $MY_DIR | sed 's/\([0-9]\+\).*/\1/g' | tr '\n' ' '`
Den obigen code gibt mir einen string wie diesen:
LIST='001 002 004 005 '
Ich greifen wollen, 005, erhöht um eins, und dann verwenden Sie diese Zahl zu generieren, die den neuen Dateinamen ein. Wie mache ich das in der BASH?
Ist dies ausgeführt, die als Teil einer web-Anwendung? Wenn der web-server nimmt mehrere gleichzeitige Anfragen (die meisten tun), wie werden Sie sich schützen gegen die race-Bedingung, wenn die Prozesse A und B das check-gleichzeitig, und erstellen Sie dann eine Datei mit der gleichen Nummer?
Nein, das war Teil von einem shell-Skript zu emulieren, die Schienen 'migration' tool für eine php-app, verwendet einen red-headed-Stiefkind der Umsetzung der Datenbank-Migrations-Muster.
Nein, das war Teil von einem shell-Skript zu emulieren, die Schienen 'migration' tool für eine php-app, verwendet einen red-headed-Stiefkind der Umsetzung der Datenbank-Migrations-Muster.
InformationsquelleAutor Jake | 2009-10-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
So, das ist bash-spezifisch. Unten ist eine alle-posix-shell-inklusive-bash Lösung, tho ich mir vorstellen, etwas einfacher möglich ist.
Das ist, weil die zahlen, beginnend mit "0" sind oktal.
Ok, oktal-bug behoben.
+1. Ich würde geklebt haben, die mit der bash-Lösung seit, die ein bestimmtes tag.
InformationsquelleAutor DigitalRoss
Brauchen Sie die ganze LISTE?
Wenn nicht
wird Ihnen nur der 005 Teil und
drucken wird die nächste Nummer in der Sequenz.
InformationsquelleAutor bmb
Nur mit standard-tools, die folgenden geben Sie das Präfix für die neue Datei ein (006):
Das funktioniert nicht mit Verzeichnissen mit vielen, vielen Dateien die Ausgabe: bash: /bin/ls: Argument list too long
Ersetzen Sie einfach die
ls [0-9]*
mitls | grep ^[0-9]
.InformationsquelleAutor Idelic
Dieser scheint mehr zu sein einfach.
InformationsquelleAutor Vijay
Schnell, subshell-frei und Schleife-free (behandelt auch Dateinamen mit Leerzeichen)*:
Ihre Beispiel-Dateien, die Ausgabe wäre:
InformationsquelleAutor Dennis Williamson
ich überlasse es Ihnen, zu tun, die Schaffung neuer Datei -
InformationsquelleAutor ghostdog74
2.
InformationsquelleAutor ghostdog74
Poste ich diese Antwort vorschlagen, eine minimal-Lösung, um die Kern-Frage "Finde höchsten nummerierten Dateinamen im einen Verzeichnis-Namen, die mit Ziffern beginnen":
Die erste Anweisung löscht die Dateien im Verzeichnis als Zwischenlagen mit die-1-option. Diese wird an die sort-Funktion sortiert in der menschlichen numerischer Reihenfolge mit "- h " und in umgekehrter Reihenfolge (die höchste Zahl zuerst) mit -r. Diese wird an die head-Funktion, die einfach liefert die n besten Ergebnisse (1 im Beispiel).
Die Antwort ist der Auffassung menschlichen numerische Sortierreihenfolge D. H. 221 ist höher als 67. Es ist eine POSIX-shell-Lösung, also sehr verträglich.
InformationsquelleAutor SebPe
Hier ist eine Lösung (die Sie benötigen, bc):
dc
: t=$(echo $f 1+pq | dc), oderexpr
: t=$(expr $f + 1), bash Mathematik: t=$(($E + 1))InformationsquelleAutor