[GELÖST!] Linux: Name / Größe der jüngsten Datei

Begonnen von DocCyber, 07 Januar 2024, 18:53:11

Vorheriges Thema - Nächstes Thema

DocCyber

Hallo zusammen.

Die jüngste Datei im Zielverzeichnis finde ich so:
ls /mnt/fritzbox-usb/raspberry/fhem/backups -t | head -1
FHEM-20240107_000500.tar.gz

Die jüngste Datei und deren Größe erhalte ich so, aber nur, wenn ich bereits im Zielverzeichnis bin.
ls -t | head -1 | xargs du -b
49163740        FHEM-20240107_000500.tar.gz

Wenn ich aber das Zielverzeichnis direkt mit angebe, funktioniert es nicht:
ls /mnt/fritzbox-usb/raspberry/fhem/backups -t | head -1 | xargs du -b
du: cannot access 'FHEM-20240107_000500.tar.gz': No such file or directory


Offenbar hängt es mit den Parametern von du zusammen, aber ich komme nicht weiter.
Weiß jemand, wie es richtig sein muss?


(PS.: Natürlich möchte ich diese Abfragen später nicht auf der RPi-Konsole machen, sondern von fhem aus ...)
Behandle die Menschen so, als wären sie, was sie sein sollten. Dadurch hilfst du ihnen zu werden, was sie sein können. (Goethe)


RPi-3 mit HM-CFG-LAN und jede Menge HM Komponenten.

betateilchen

Zitat von: DocCyber am 07 Januar 2024, 18:53:11(PS.: Natürlich möchte ich diese Abfragen später nicht auf der RPi-Konsole machen, sondern von fhem aus ...)

Und warum willst Du das dann unbedingt über einen Betriebssystemaufruf machen, anstatt das einfach in perl abzufragen?

So findest Du beispielsweise den Dateinamen der jüngsten Datei in einem Verzeichnis:

sub newestFileName {
  my $path = shift;

  opendir(my $DH, $path);
  return(
    (map {$_->[0]}
     sort {$a->[1] <=> $b->[1]}
     map{[$_, -M "$path/$_"]}
     readdir $DH
    )[0]);
}

Das wird dann mit

{newestFileName "/opt/fhem/log/"}

aufgerufen. Wenn Du den Dateinamen gefunden hast, kannst Du mit stat() jede andere Information zur Datei abfragen.

sub fileSize {
  my $fileName = shift;
  return (stat($fileName))[7];
}

Aufruf mit

{fileSize "/opt/fhem/fhem.pl"}

Das Ganze kann man natürlich kombinieren:

sub newestFile {
  my $path = shift;
  my $fileName = newestFileName($path);
  my $fileSize = fileSize("$path$fileName");
  return "file: $fileName size: $fileSize"; # Rückgabe zum Testen
  #return ($fileName,$fileSize);             # Rückgabe zur Weiterverarbeitung
}
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

DocCyber

#2
Zitat von: betateilchen am 07 Januar 2024, 21:32:31unbedingt über einen Betriebssystemaufruf

Danke für deinen Input.

Naja ... von unbedingt kann eigentlich nicht die Rede sein.

Natürlich kann man das direkt über Perl machen, aber die andere Lösung reizt mich - und ist auch kürzer.
Deshalb, aber auch aus prinzipiellen Gründen möchte ich schon verstehen, warum das nicht klappt bzw was ich falsch gemacht habe.

Kannst du mir helfen?
Behandle die Menschen so, als wären sie, was sie sein sollten. Dadurch hilfst du ihnen zu werden, was sie sein können. (Goethe)


RPi-3 mit HM-CFG-LAN und jede Menge HM Komponenten.

betateilchen

Generell bin ich kein Freund von allzu vielen selbstgestrickten Aufrufen aus FHEM ins Betriebssystem, deshalb will ich mich damit nicht beschäftigen.

Zitat von: DocCyber am 08 Januar 2024, 11:19:31die andere Lösung reizt mich - und ist auch kürzer.

Mich reizt sie auch - aber eher negativ.
Und über die Frage, was "kürzer" bedeutet, könnte man jetzt stundenlang diskutieren.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

RalfRog

Zitat von: DocCyber am 07 Januar 2024, 18:53:11Die jüngste Datei und deren Größe erhalte ich so, aber nur, wenn ich bereits im Zielverzeichnis bin.
ls -t | head -1 | xargs du -b
49163740        FHEM-20240107_000500.tar.gz

Wenn ich aber das Zielverzeichnis direkt mit angebe, funktioniert es nicht:
ls /mnt/fritzbox-usb/raspberry/fhem/backups -t | head -1 | xargs du -b
du: cannot access 'FHEM-20240107_000500.tar.gz': No such file or directory

Naja,
"ls" liefert nur die Dateinamen im Verzeichnis.
Im Zielverzeichnis kann "du" die Dateien finden und wenn du woanders bist gibt es die Dateien dort nicht, daher: "No such file or directory".

Gruß Ralf
FHEM auf Raspi 2B mit nanoCUL, HM-MOD-RPI-PCB und über LAN MAX!Cube mit a-culFW (Stack 868 + 433)
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder

DocCyber

Zitat von: RalfRog am 08 Januar 2024, 13:51:30"ls" liefert nur die Dateinamen im Verzeichnis.
Im Zielverzeichnis kann "du" die Dateien finden und wenn du woanders bist gibt es die Dateien dort nicht, daher: "No such file or directory".

Schade, aber jetzt weiß ich wenigstens, warum das so ist.
Danke.
Behandle die Menschen so, als wären sie, was sie sein sollten. Dadurch hilfst du ihnen zu werden, was sie sein können. (Goethe)


RPi-3 mit HM-CFG-LAN und jede Menge HM Komponenten.

DocCyber

Zitat von: betateilchen am 08 Januar 2024, 12:37:57über die Frage, was "kürzer" bedeutet, könnte man jetzt stundenlang diskutieren.
stimmt - und wegen Zeitmangel tun wir das jetzt auch nicht.  ;)

Die Frage stellt sich aber mittlerweile ohnehin nicht mehr - weil's nicht so geht, wie ich mir das gewünscht hätte.

Danke nochmals für deine Lösung.
Behandle die Menschen so, als wären sie, was sie sein sollten. Dadurch hilfst du ihnen zu werden, was sie sein können. (Goethe)


RPi-3 mit HM-CFG-LAN und jede Menge HM Komponenten.