Suchen Sie die letzte Datei im Verzeichnis, deren Dateinamensende mit einer Zeichenfolge übereinstimmt

Suchen Sie die letzte Datei im Verzeichnis, deren Dateinamensende mit einer Zeichenfolge übereinstimmt

Ich schreibe ein Skript zum Erstellen/Kopieren von Dateien, um den Arbeitsablauf zu beschleunigen. In diesem Fall muss ein Verzeichnis nach Dateien durchsucht werden, die mit einer bestimmten Zeichenfolge enden, und wenn eine oder mehrere gefunden werden, muss die letzte in der Sequenz gezielt kopiert werden. (Wenn keine gefunden werden, kopiert das Skript eine neue Datei aus einem anderen Verzeichnis.)

Dieses Verzeichnis kann mehrere Dateisätze enthalten, die alle dem Format folgen;

YYYYMMDD_##_user_filename.json

Ein Beispielordner könnte also Folgendes enthalten:

20161021_01_test_parameters.json
20161021_01_test_stack.json
20161021_02_test_parameters.json
20161021_02_test_stack.json
20161022_03_test_parameters.json
20161025_04_test_parameters.json
20161025_04_test_stack.json

In diesem Fall muss das Skript alle Dateien mit der Endung lesen parameters.jsonund sie dann nach ihrer Versionsnummer (01, 02 usw.) sortieren, um herauszufinden, welche die letzte in der Sequenz ist. Diese Datei sollte dann mit der nächsten Versionsnummer in denselben Ordner kopiert werden. Für diesen Zweck ist das Datum irrelevant und Sie können davon ausgehen, dass es niemals doppelte Versionsnummern geben wird.

Ich habe verwendet if [ -e $1/*"parameters.json" ]; then cp $1/*"parameters.json" "$FILENAME"_parameters.json(wo $1ist das Verzeichnis, in das diese Dateien verschoben werden – wichtig, weil sich das Skript außerhalb der Verzeichnisse befindet, auf die eingewirkt werden soll, und $FILENAMEnur eine Variable zum Berechnen von Speicherort, Datum, Versionsnummer usw. ist), aber das hilft natürlich nicht dabei, die aktuellste zu finden.

Antwort1

Da die Zahl, nach der Sie sortieren möchten, immer das zweite durch Unterstriche getrennte Feld zu sein scheint, sollten Sie in der Lage sein, etwas wie

find path/to/dir/ -maxdepth 1 -name '*parameters.json' | sort -t_ -nk2,2 | tail -n1

Wenn Sie mit der Möglichkeit umgehen müssen, dass Dateinamen Zeilenumbrüche enthalten und Ihre Kernprogramme dies unterstützen, können Sie den gesamten Befehl durch Nullen trennen, z. B.

find path/to/dir/ -maxdepth 1 -name '*parameters.json' -print0 | sort -zt_ -nk2,2 | tail -zn1

verwandte Informationen