Finde die neueste Datei. Einschränkungen für mehrere Dateitypen

7

Ich möchte einen Befehl schreiben, der mir rekursiv die neueste Datei in einem Verzeichnis gibt . Aber das ist nicht meine einzige Einschränkung. Die Dateien müssen eine MP3- oder eine JPG- Datei sein. ( Groß- und Kleinschreibung wird nicht bevorzugt) Ich benötige nur das Erstellungsdatum dieser neuesten Datei. Wenn möglich, möchte ich, dass es so formatiert wird: 30-12-2014 (also: Tag-Monat-Jahr )

Dies ist derzeit, was ich habe:

find .  -name '*.mp3' -or -name '*.JPG'   -printf "%TD \n" | sort -rn | head -n 1

Aber es funktioniert nicht gut. Ich bekomme nur JPGs und das Datum ist nicht formatiert.

user2815780
quelle
Überprüfen Sie dies: mywiki.wooledge.org/BashFAQ/099?highlight=%28oldest%29
Valentin Bajrami

Antworten:

5

So etwas sollte funktionieren:

find . \( -iname "*.mp3" -o -iname "*.jpg" \) -printf '%TY%Tm%Td %TT %p\n' | sort -r

Dies sollte die Dateien finden, die (ohne Berücksichtigung der Groß- und Kleinschreibung) Dateien finden, die mit mp3 oder jpg enden, die Änderungszeit ausdrucken und dann in umgekehrter Reihenfolge sortieren.

Es scheint beide Dateitypen anzuzeigen, wenn Sie es effektiv als zwei Befehle ausführen:

( find . -iname "*.mp3" -printf '%TY%Tm%Td %TT %p\n' ; find . -iname "*.jpg" -printf '%TY%Tm%Td %TT %p\n' ) | sort -r
Wilf
quelle
Ich erhalte nur die JPG-Dateien mit diesem Befehl. Es werden keine MP3s angezeigt. Das Umschalten von themp3 und jpg gibt mir nur mp3's
user2815780
@Wilf du \( -iname '*.mp3 -o -iname '*.jpg' \) sonst brauchst es passt das eine oder andere.
Valentin Bajrami
@ val0x00ff - danke - fragte sich, warum es komisch war ... gibt es einen tatsächlichen Grund, warum find das macht? Ich habe zuvor festgestellt, dass es auch Probleme mit Pfaden gab ...
Wilf
1
@ Wilf scrolle auf dieser Seite nur ein bisschen nach unten: mywiki.wooledge.org/UsingFind und du wirst die Antwort finden.
Valentin Bajrami
4

Mit zsh:

setopt extendedglob
zmodload zsh/stat
zstat -F %F +mtime -- **/(#i)*.(mp3|jpg)(Om[1])

Beachten Sie, dass es auf der letzten Änderungszeit basiert. Die Erstellungszeit (was auch immer das bedeutet) ist unter Linux im Allgemeinen nicht ohne weiteres verfügbar.

Versteckte Dateien werden nicht berücksichtigt. Wenn Sie sie wollen, fügen Sie das DGlobbing-Qualifikationsmerkmal oben hinzu.

Stéphane Chazelas
quelle
euhm ich benutze debian (und ich bin ein linux noob). Diese Befehle funktionieren nicht. Muss ich etwas installieren, weil ich es lieber nicht möchte?
user2815780
1
Sie müssen nur zshdie Lösung eingeben und ausprobieren. In den meisten Systemen wird die zshShell standardmäßig verwendet.
Ramesh
Auf meinem Himbeer-Pi passiert nichts.
user2815780
2

Siehe auch folgendes:

find . -type f -mtime -1 \( -name '*.mp3' -o -name '*.jpg' \) -printf '%AY-%Am-%Ad %P \n'
Valentin Bajrami
quelle
Ich bekomme keine Ausgabe: /. Ist aber nicht abgestürzt.
user2815780
@ user2815780 Sie können damit spielen, -mtime -1indem Sie die Änderungszeit ändern. Zum Beispiel -mtime -10, die nach MP3- oder JPG-Dateien suchen, die in 10 Tagen erstellt werden, und natürlich können |head -n4Sie am Ende festlegen oder was auch immer Sie wollen
Valentin Bajrami
funktioniert nicht, sorry. Immer noch keine Ausgabe. Nach dem Erstellungsdatum der Datei sollte eine Ausgabe erfolgen: /
user2815780
1
@ user2815780 'Immer noch keine Ausgabe' reicht nicht aus. Vielleicht müssen Sie erhöhen -mtime -100 , um nach den neuesten 100 Dasys zu suchen
Valentin Bajrami
Ja, das habe ich getan, aber es hat nicht funktioniert. Ich habe es sogar auf 999 eingestellt. Ich habe die Uhr auf meinem System überprüft und das Datum der Dateien überprüft. Bis dahin kein Glück.
user2815780
0

Sie haben -oder angegeben, das muss -o sein, wie andere korrigiert haben. Sie brauchen auch Klammern, denke ich (Korrektur in meinem ursprünglichen Beitrag). Ich würde empfehlen, %T@für den Formatbezeichner (Sekunden seit 1970) zu verwenden, der sauberer zu sortieren ist. dann können Sie es mit konvertieren

date --date="@`find . \\( -iname "*.mp3" -o -iname "*.jpg" \\) -printf '%T@\n' | sort -rn | head -n1`" 

oder Wasauchimmer. Sie können auch das gewünschte Datumsformat verwenden +.

eewanco
quelle