2016-09-08 3 views
0

Ich habe einige Randoms Datum Ordner vor Ort /Users/skull/Desktop und ich möchte den Ordner des heutigen Datums auswählen/finden und wenn nicht dort dann wählen Sie am nächsten zum heutigen Datum weniger. Sollte nehmen nicht hoch Datum Ordner zB: Heute Datum 2016-09-08 wie vor Ort haben wir nicht 2016-09-08 Ordner, so sollte es weniger am nächsten Tag nehmen die 2016-09-06 oder wenn 2016-09-06 nicht da ist dann 2016-08-30Shell-Skript zum Auffinden von Ordner

Ordnernamen:

2016-07-015 
2016-07-27 
2016-08-30 
2016-09-05 
2016-09-06 
2016-09-10 
2016-09-15 
2016-09-20 

-Code ich habe bisher:

location=/Users/Skull/Desktop 
DAY=$(date +"%Y-%m-%d"| awk '{print $1$2$3}') 
#2016-09-08 
DATA_FOLDER= 
+2

'ls | tail -n 1' bringt dir das heutige dir oder das neueste (nächste), wenn du keine zukünftigen Daten in dir-Namen hast. –

+0

@JamesBrown Schauen Sie sich das Beispiel an, er hat einige Zukunftstermine. – Barmar

+1

@Skull Was ist '| awk '{print $ 1 $ 2 $ 3}' 'soll das erreichen ?! – Biffen

Antwort

2

Ausgabe die Namen in umgekehrter Reihenfolge. Verwenden Sie dann ein Skript awk, das das erste Dokument druckt, das kleiner oder gleich dem aktuellen Datum ist.

DATA_FOLDER=$(ls -r "$location" | awk -v day=$DAY '$0 <= day {print; exit}') 
+0

In meiner Umgebung (Debian) 'ls -R 'ist' --recursive' und '-r' ist' --reverse'. –

+0

@Barmar Das Ergebnis kommt 2016-07-27 Ich denke, es erzählt den ältesten Ordner und ich möchte das aktuelle Datum oder am nächsten zum aktuellen Datum. 'location = "/ Users/Schädel/Desktop/Ordner /" echo $ Lage DAY = $ (Datum + "% Y-% m-% d" | awk '{print $ 1 $ 2 $ 3}') # 2016.09.09 DATA_FOLDER = $ (ls -R "$ location" | awk -v Tag = $ dAY '$ 0 <= Tag {print; exit}') echo "$ DATA_FOLDER" ' – Skull

+0

@ Barmar @James Brown Danke, ich habe 'DATA_FOLDER = $ (ls -r "$ location" | awk -v Tag = $ DAY' $ 0 <= Tag {print; exit} ') 'benutzt und bekomme den aktuellen Datumsordner und wenn nicht, dann in der Nähe von dem ist 2016-09-06 :) Vielen Dank noch einmal für Sie Hilfe Jungs. – Skull

-1

Ich würde es so machen:

DATA_FOLDER="$(ls "$location" | grep -P '^\d{4}-d{2}-d{2}$' | sed "/^$(date +%F)\$/q" | tail -n1)" 

I ls verwenden, um alle Dateien zu finden, die nur Filter diejenigen, deren Name ist ein Datum, halten die diejenigen, bis zu dem man das entspricht bis zum heutigen Datum, und schließlich alle bis auf die letzte verwerfen, die das heutige Datum oder das letzte Datum sein muss.

1

analysieren Nie ls Ausgabe: http://mywiki.wooledge.org/ParsingLs

Bessere Nutzung printf und awk:

cd "$location" 
printf '%q\n' * | awk 'END{if(/[0-9]{4}-[0-9]{2}-[0-9]{2}/){print}}' 
+0

'printf '% s \ n' * | 'ist genau gleich 'ls -1 | '. – alvits

+0

@Gilles Quenot @alvits Mit dem 'DATA_FOLDER = $ (printf '% s \ n' | awk 'ENDE {if (/ [0-9] {4} - [0-9] {2} - [0- 9] {2} /) {print}} ') 'oder' DATA_FOLDER = $ (ls -1 | awk' ENDE {if (/ [0-9] {4} - [0-9] {2} - [ 0-9] {2} /) {print}} ') Ich erhalte das Ergebnis 2016-09-20 welches ist der höchste Datum Ordner im Ort, ich habe die Tage geändert und 2016-10-29 und dann das Ergebnis hinzugefügt ist 2016-10-29. Wie es sollte zeigen aktuelle datum ordner und wenn nicht dort in location dann weniger nächste datum das ist 2016-09-06 – Skull

+0

@alvits Nein ist es nicht. 'ls' macht alle möglichen verrückten Dinge mit nicht druckbaren Zeichen, Verzeichnissen usw. – tripleee

0

Dank @Barmar @James Brown, die geholfen haben. Unten ist das letzte funktionierende Skript von meinen Qus :)

location=/Users/Skull/Desktop 
DAY=$(date +"%Y-%m-%d") 
#today date = 2016-09-09 
DATA_FOLDER=$(ls -r "$location" | awk -v day=$DAY '$0 <= day {print; exit}') 
echo "$DATA_FOLDER" 
#Result = 2016-09-06 
Verwandte Themen