FHEM Forum

FHEM - Hardware => Einplatinencomputer => Thema gestartet von: DocCyber am 07 Januar 2024, 18:53:11

Titel: [GELÖST!] Linux: Name / Größe der jüngsten Datei
Beitrag von: DocCyber am 07 Januar 2024, 18:53:11
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 ...)
Titel: Aw: Linux: Name / Größe der jüngsten Datei
Beitrag von: betateilchen am 07 Januar 2024, 21:32:31
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() (https://perldoc.perl.org/functions/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
}
Titel: Aw: Linux: Name / Größe der jüngsten Datei
Beitrag von: DocCyber am 08 Januar 2024, 11:19:31
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?
Titel: Aw: Linux: Name / Größe der jüngsten Datei
Beitrag von: betateilchen am 08 Januar 2024, 12:37:57
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.

Titel: Aw: Linux: Name / Größe der jüngsten Datei
Beitrag von: RalfRog am 08 Januar 2024, 13:51:30
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
Titel: Aw: Linux: Name / Größe der jüngsten Datei
Beitrag von: DocCyber am 08 Januar 2024, 16:36:54
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.
Titel: Aw: Linux: Name / Größe der jüngsten Datei
Beitrag von: DocCyber am 08 Januar 2024, 16:39:43
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.