Einer meiner Ordner enthält Dateien im folgenden Format:
3_20150412104422154033.txt
3_2015041211022775012.txt
3_20150412160410171639.txt
3_20150412160815638933.txt
3_20150413161046573097.txt
3_20150413161818852312.txt
3_20150413163054600311.txt
3_20150413163514489159.txt
3_2015041321292659391.txt
3_20150414124528747462.txt
3_20150414125110440425.txt
3_20150414134437706174.txt
3_20150415085045179056.txt
3_20150415100637970281.txt
3_20150415101749513872.txt
Ich möchte Dateien abrufen, deren Datumswert kleiner oder gleich meinem eingegebenen Datumswert ist.
Wenn ich beispielsweise "3_20150414" (3_YYYYMMDD) gebe, möchte ich, dass die Ausgabe die Dateinamen sind
3_20150412104422154033.txt
3_2015041211022775012.txt
3_20150412160410171639.txt
3_20150412160815638933.txt
3_20150413161046573097.txt
3_20150413161818852312.txt
3_20150413163054600311.txt
3_20150413163514489159.txt
3_2015041321292659391.txt
3_20150414124528747462.txt
3_20150414125110440425.txt
3_20150414134437706174.txt
Ich kann die Dateien auflisten, indem ich einen Befehl wie diesen gebe:
ls -l | grep '20150413\|20150414' |awk '{print $NF}'
Aber ich kämpfe darum, eine <=
Übereinstimmung zu finden .
Antworten:
Sie können
awk
und seinen String-Vergleichsoperator verwenden.In einer Variablen:
Durch die Verkettung mit "z" wird hier sichergestellt, dass es sich bei dem Vergleich um einen Zeichenfolgenvergleich handelt, und es ist jederzeit an diesem Tag möglich, da im
C
Gebietsschema die Ziffern zuvor sortiert werdenz
.quelle
grep
hat keinen ≤ Betreiber per se , aber es gibt eine kludgy Art und Weise zu fälschen. Sie möchten alle Daten zwischen dem Jahr 0 (oder dem Jahr 1; je nachdem, welches erste Jahr war) bis 20150414. (Ich gehe davon aus, dass BC-Daten vom Tisch sind.) Teilen Sie diesen Bereich in Unterbereiche auf, die durch reguläre Ausdrücke abgeglichen werden können:[01]
.(Es wird davon ausgegangen, dass alle regulären Ausdrücke am Zeilenanfang direkt nach dem „3_“ verankert sind.)
200
.201[0-4]
.20150[1-3]
.2014040
2014041[0-4]
und dann alle zusammenfügen:
ls -l
Natürlich erhalten Sie viele Informationen zu den Dateien (Modus, Besitzer, Mod-Zeit usw.), die Sie nicht benötigen. Sie könnenawk '{print $NF}'
sie also entfernen und nur den Dateinamen belassen. Dies ist ineffizient und fehleranfällig (es bricht ab, wenn ein Dateiname ein Leerzeichen oder eine Registerkarte enthält). Das Parsen der Ausgabe vonls
ist nie eine gute Idee, aber Sie können es ein wenig sicherer machen, indem Sie es ein wenig einfacher machen: Erhalten Sie einfach nicht die Informationen, die Sie nicht wollen oder brauchen, und dann müssen Sie sie nicht verwerfen .sollte gut genug sein.
Das Erstellen dieses sechsteiligen regulären Ausdrucks ist jedoch mühsam und fehleranfällig und schwierig (wenn auch nicht unmöglich) zu schreiben. Hier ist ein sauberer Weg:
Dies extrahiert die acht Zeichen beginnend mit der 3. Position (dh nach dem „3_“) und vergleicht sie mit 20150414 als zwei achtstellige Zahlen.
quelle
Mögliche Lösung anhand Ihres Beispiels:
Ich habe Ihr Grep-Muster ein wenig geändert und den gesuchten Wert als Argument an das übergeben,
awk
wo wir nur Zeichenfolgen vergleichen, um die gewünschten Dinge auszugeben.Es gibt auch viele Artikel, warum Sie nicht analysieren sollten,
ls
also ändere ich es ein wenig mit find:quelle