Bash: find Ausgabe an ls weitergeben

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Exxter
Beiträge: 385
Registriert: 10.01.2003 00:15:15
Lizenz eigener Beiträge: GNU General Public License

Bash: find Ausgabe an ls weitergeben

Beitrag von Exxter » 01.09.2017 08:59:31

Guten Morgen,

ich schreibe an einem Bash-Script, welches alle 10 Minuten den Inhalt eines Verzeichnisses nach neuen Dateien überprüft und die älteste Datei in NextCloud hochlädt. Dabei soll es leere Dateien (mit touch angelegte) ignorieren. Letztes funktioniert noch nicht:

Code: Alles auswählen

root@raspi:/upload/$ find . -not -empty -exec ls -Atr {} +
test1  test2  test54  htdghhfhfh  ls
root@raspi:/upload/$
oder

Code: Alles auswählen

root@raspi:/upload/$ find . -size +1048c -exec ls -Atr {} +
test1  test2  test54  htdghhfhfh  ls
root@raspi:/upload/$
die angezeigten Dateien sind alle per touch angelegt. In obigen Beispielen fehlt noch das head -n 1, damit nur die erste Datei genommen wird.

Hier das komplette Script:

Code: Alles auswählen

#!/bin/bash

if [ -f /var/run/raspi-upload-test-script.lock ] ;then
  echo "Script laeuft noch"
  exit 0
fi

touch /var/run/raspi-upload-test-script.lock

cd /upload/test/

# erste und älteste Datei im Verzeichnis
datei=$(find . -not -empty | ls -Atr | head -n 1)

if [ -z "$datei" ]
then
        # leere Variable, keine Dateien im Verzeichnis
        rm /var/run/raspi-upload-test-script.lock
        exit 0
else
  if lsof -w "$datei" > /dev/null;
        then
                # Datei geoeffnet, Abbruch
                rm /var/run/raspi-upload-test-script.lock
                exit 0

        else
                # Datei hochladen
                curl --limit-rate 100k -u USER:XXXXXXXXXXXXXXXXX -T $datei "https://example.org/cloud/remote.php/dav/files/USER/test/"
                rm $datei
                touch /upload/test/$datei
                rm /var/run/raspi-upload-test-script.lock
  fi
fi

exit 0
Jemand eine Idee wie ich das lösen könnte?

Und mal am Rande, hat sowas vielleicht schon jemand im Einsatz? Die Idee, einen Raspi als "Upload-Station" zu nutzen, sollte doch nicht neu sein? Das Verzeichnis ist per Samba freigegeben, alles was dort reingelegt wird, soll in die NextCloud hochgeladen werden. Als History soll der Name der hochgeladenen Datei im gleichen Verzeichnis per touch angelegt werden.
Den grafischen NextCloud Client wollte ich nicht nutzen, da ich dafür eine grafische Oberfläche auf dem Raspi haben müsste.

owl102

Re: Bash: find Ausgabe an ls weitergeben

Beitrag von owl102 » 01.09.2017 09:22:22

Wollte man wirklich ls zum sortieren verwenden, müsste man das Ergebnis von find zunächst in einer Variablen speichern, etwa so:

Code: Alles auswählen

files=$(find . -type f -not -empty)
if [ "$files" ]
then
  ls -Atr $files | head -n 1
fi
oder kürzer (wenn man sicher ist, daß immer Dateien da sind, die nicht leer sind):

Code: Alles auswählen

ls -Atr $(find . -type f -not -empty) | head -n 1
ABER: Das klappt nicht mit Dateinamen, die ein Leerzeichen enthalten, und die Ausgabe von ls taugt sowieso nur bedingt zur weiteren Verwendung in Scripten.

Ich würde stattdessen Ergebnis von find nehmen und selber mit Hilfe des Vergleiches "-ot" die älteste Datei heraussuchen. Siehe auch: http://mywiki.wooledge.org/BashFAQ/003
Zuletzt geändert von owl102 am 02.09.2017 10:57:15, insgesamt 2-mal geändert.

scientific
Beiträge: 3022
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: Bash: find Ausgabe an ls weitergeben

Beitrag von scientific » 01.09.2017 12:34:20

Kennst du incron, oder systemd.path?

Damit kannst du Verzeichnisse direkt überwachen lassen, und im Falle einer Änderung (z. B. Hinzufügen einer Datei) diese dann verarbeiten lassen.

Lg scientific
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

nephilim
Beiträge: 39
Registriert: 06.03.2017 18:11:50

Re: Bash: find Ausgabe an ls weitergeben

Beitrag von nephilim » 02.09.2017 08:21:39

Guten Morgen,

ist das vielleicht eine Hilfe dabei: https://docs.nextcloud.com/server/10/us ... _drop.html ?

VG // neph

Benutzeravatar
Meillo
Moderator
Beiträge: 9230
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Bash: find Ausgabe an ls weitergeben

Beitrag von Meillo » 02.09.2017 09:47:29

Man kann in den Antworten in diesem Thread an zwei Punkten ansetzen: Am grundsaetzlichen Verfahren und an dessen Implementierung.

Ich denke, es wuerde Sinn machen, zuerst nochmal das Verfahren selbst zu durchdenken.

Ich verstehe nicht warum du nur die aelteste der neuen Dateien hochladen willst, statt alle. Das waere doch viel einfacher umzusetzen. Und warum loggst du per touch(1) und nicht per Logfile? Es ist meist erfolgreicher, erstmal die einfachste Umsetzung zum Laufen zu kriegen und anschliessend die Spezialfaelle einzubauen.

Was die Umsetzung angeht, so waere `find -print0 | xargs -0' vielleicht ein Ausgangspunkt. ... zuerst solltest du aber erst nochmal ueber dein grundsaetzliches Verfahren nachdenken.
Use ed once in a while!

debianoli
Beiträge: 4152
Registriert: 07.11.2007 13:58:49
Lizenz eigener Beiträge: MIT Lizenz

Re: Bash: find Ausgabe an ls weitergeben

Beitrag von debianoli » 02.09.2017 09:53:26

Warum eigentlich nicht rsync per cron Job aufrufen? Da werden nur Änderungen übertragen und die Ausgabe von rsync kann man auch in ein Log File schreiben.

Antworten