staging.inyokaproject.org

find und mv script

Status: Ungelöst | Ubuntu-Version: Ubuntu 16.04 (Xenial Xerus)
Antworten |

theom

Anmeldungsdatum:
24. August 2016

Beiträge: 15

Hallo,

ich habe ein kleines find und mv Script, nun suche ich nach einer Möglichkeit, dem Script beizubringen, dass es nur Dateien verschiebt, wenn diese fertig erstellt sind. Geht so was? Das Script wird per Cron alle 30 Minuten ausgeführt, wäre nur dumm, wenn eine Datei verschoben wird, die noch nicht fertig ist. Es sind auf dem einem System PDF's und auf dem anderen .mkv Dateien. Im Moment habe ich es über die Größe geregelt, dass heisst, dass ich vorher aber wissen muss wie groß die Datei wird und muss es auch für jede Konvertierung anpassen. Dass ist etwas unhandlich, leider.

 find /volume2/VMShare/vmtausch/ -type f -size +1200M -name *.mkv -exec mv {} /volume2/VMShare/Files \;

Jemand eine Idee....Gruß Theo

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Du kannst mit fuser nachsehen, ob eine Datei gerade von einem Prozess genutzt wird. Das sollte den Fall abdecken, dass ein Programm gerade schreibt (zwischendrin muss es den Filedescriptor nicht zwingend halten, wenn die Datei im Programm geöffnet ist).

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

theom schrieb:

Das Script wird per Cron alle 30 Minuten ausgeführt, wäre nur dumm, wenn eine Datei verschoben wird, die noch nicht fertig ist.

Wieso? Welche Probleme hast Du beobachtet oder erwartest Du?

Wenn ich einen Audiopodcast runterlade nach ~/dl und von da nach ~/audio verschiebe, obwohl der Download noch läuft, habe ich keine Probleme, ist aber die gleiche Partition.

theom

(Themenstarter)

Anmeldungsdatum:
24. August 2016

Beiträge: 15

user_unknown

Wieso? Welche Probleme hast Du beobachtet oder erwartest Du?

Ich dachte oder erwarte, dass dann die unfertige Datei von a nach b kopiert wird und ggf. später beim nächsten Aufruf vom rest überschrieben wird und dass dadurch die Datei unbrauchbar wird. Ist dem nicht so?

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Wenn das schreibende Programm die Datei nicht zwischendurch schließt und neu öffnet, wohl nicht.

Programm A öffnet eine Datei zum Schreiben und legt einen Eintrag im Dateisystem an, wo die Datei ist, wie sie heißt, was ihr Pfad ist und beginnt da, wo sie ist, zu schreiben.

Programm B kommt, und ändert die Information was der Pfad ist. Das bekommt Programm A gar nicht mit, weil nur die Metainformation geändert wird, die man üblicherweise beim Erzeugen nur einmal erzeugt oder abfragt.

Bei unterschiedlichen Partitionen ist das anders. Da wird die Datei ja an eine physisch andere Stelle verfrachtet. A könnte also gemächlich schreiben, B beginnt zu kopieren und holt A ein, stellt fest, dass da keine weiteren Bytes sind, und beendet den Kopiervorgang. Da es kein Kopier- sondern ein mv-Befehl war, löscht B dann die Datei an der Quelle. Was da dann genau vor sich geht weiß ich nicht.

Dabei muss ich sagen, dass ich mir weder den Quellcode der Befehle angeschaut habe, noch die Spezifikation studiert habe, was wann passieren soll, sondern mir das aus Beobachtungen, die nicht meinen Erwartungen ersprachen, zusammengereimt habe.

Ich meine die Erfahrung gemacht zu haben, dass ich, wenn ich mit Firefox eine große Datei runterlade, und dann in Thunar ansehe, und sehe, wie sie 10, 15, 20 MB groß wird und weiter wächst, und währenddessen schon lösche, dass sie Firefox dann bis zum Ende trotzdem runterläd, und sie daraufhin aber - plopp - fort ist, sobald sie fertig runtergeladen ist.

sebix Team-Icon

Ehemalige

Anmeldungsdatum:
14. April 2009

Beiträge: 5584

user_unknown schrieb:

Dabei muss ich sagen, dass ich mir weder den Quellcode der Befehle angeschaut habe, noch die Spezifikation studiert habe, was wann passieren soll, sondern mir das aus Beobachtungen, die nicht meinen Erwartungen ersprachen, zusammengereimt habe.

Dem ist auch so. Unter Windows ist das anders - daher vielleicht die Befuerchtung des TE, man koennte damit die Datei zerstueckeln.

Ich meine die Erfahrung gemacht zu haben, dass ich, wenn ich mit Firefox eine große Datei runterlade, und dann in Thunar ansehe, und sehe, wie sie 10, 15, 20 MB groß wird und weiter wächst, und währenddessen schon lösche, dass sie Firefox dann bis zum Ende trotzdem runterläd, und sie daraufhin aber - plopp - fort ist, sobald sie fertig runtergeladen ist.

Bei den Browsern muss man aufpassen, denn die erstellen gerne tempoaere Dateien, die nicht so heissen wie die eigentliche Datei und benennen dann am Ende um.

theom

(Themenstarter)

Anmeldungsdatum:
24. August 2016

Beiträge: 15

Habe es gerade mal getestet

VM entpackt in Verzeichnis vom Host, währen des entpackens der Datei setze ich

find /volume2/VMShare/vmtausch/ -type f -name "*.avi" -exec mv {} /volume2/VMShare/File \;

Die Datei wird kopiert, gelöscht und hat statt 500MB nur 105MB, danach ist die Datei weg und natürlich defekt.

Bearbeitet von sebix:

Bitte verwende in Zukunft Codeblöcke, um die Übersicht im Forum zu verbessern!

sebix Team-Icon

Ehemalige

Anmeldungsdatum:
14. April 2009

Beiträge: 5584

Sind die beiden Verzeichnisse auf der gleichen Partition und welches Programm schreibt die Datei?

Technische Erklaerung zB hier: https://superuser.com/questions/251129/moving-a-file-while-its-in-use-how-does-it-work

theom

(Themenstarter)

Anmeldungsdatum:
24. August 2016

Beiträge: 15

Nein, sind leider nicht auf der gleichen Partition. Das eine Verzeichnis ist per smb gelinkt und ein zip Programm entpackt die Datei. Ein Skript verschiebt die Dateien alle 30 Minuten.

sebix Team-Icon

Ehemalige

Anmeldungsdatum:
14. April 2009

Beiträge: 5584

theom schrieb:

Nein, sind leider nicht auf der gleichen Partition.

Dann musst du mit lsof oder fuser ueberpruefen, ob die Datei momentan geoeffnet ist.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

theom schrieb:

ich habe ein kleines find und mv Script, nun suche ich nach einer Möglichkeit, dem Script beizubringen, dass es nur Dateien verschiebt, wenn diese fertig erstellt sind. Geht so was?

So etwas macht man besser mit inotifywait aus dem Paket inotify-tools. Ich benutze regelmäßig so ein Skript für den gleichen Usecase:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/sh

test -n "$DEBUG" && set -x

set -e

target="/pfad"

if [ ! -d "$target" ]; then
  echo "ERROR: target does not exist: $target" >&2
  exit 1
fi

cd irgendwo

inotifywait -mrqe close_write --format '%w%f' . | while IFS= read -r f; do
  if [ -f "$f" ]; then
    mv -i "$f" "$target"
  fi
done

Das Skript muss man permanent laufen lassen; zumindest muss es laufen, bevor eine zu verschiebende Datei fertig geworden ist. Sobald eine Datei fertig geschrieben ist, wird sie verschoben.

theom

(Themenstarter)

Anmeldungsdatum:
24. August 2016

Beiträge: 15

rklm schrieb:

So etwas macht man besser mit inotifywait aus dem Paket inotify-tools. Ich benutze regelmäßig so ein Skript für den gleichen Usecase:

Das Skript muss man permanent laufen lassen...

@rklm Klingt gut, danke Dir.

Dazu habe ich noch zwei Fragen. Zum einen, wie lässt man dieses Skript permanent laufen lassen...per Cron Sekündlich? Da es auch auf einer Synology Diskstation laufen soll ist es etwas schwieriger, da ich dort nur Minütlich auswählen kann. Das Paket ist installiert.

Wo hinterlege ich in Deinem Skript, welche Dateien verschoben werden sollen (sprich pdf/mkv/avi etc...) und von wo nach wohin.

Danke Dir

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

theom schrieb:

Zum einen, wie lässt man dieses Skript permanent laufen lassen...per Cron Sekündlich?

Nein. Du startest es und lässt es laufen, solange der Rechner läuft, der Benutzer eingeloggt ist o.ä.

Wo hinterlege ich in Deinem Skript, welche Dateien verschoben werden sollen (sprich pdf/mkv/avi etc...) und von wo nach wohin.

Im Moment filtert das in Zeile 17 nur nach Dateien. Du kannst aber in Zeile 17 oder danach noch weiter filtern. Oft macht sich case da nützlich, also z.B.

1
2
3
4
5
case "$f" in
*.zip)  echo "Verschiebe ZIP: $f";;
*.sh|*.csh) echo "Mache etwas mit Shellskript $f";;
*) echo "Ignoriere $f";;
esac

Oder, wenn es Dir nur um eine Erweiterung geht, kannst Du das in Zeile 17 auf eine dieser beiden Arten einbauen:

1
2
3
4
5
6
7
  if [ -f "$f" -a "$f" != "${f%*.zip}" ]; then
    mv -i "$f" "$target"
  fi

  if [ -f "$f" -a -z "${f%%*.zip}" ]; then
    mv -i "$f" "$target"
  fi

Ich finde die zweite eleganter.

theom

(Themenstarter)

Anmeldungsdatum:
24. August 2016

Beiträge: 15

Ok, danke @rklm

Kann ich auch mehrere Dateiendungen hinterlegen in Deinem zweiten und von Dir bevorzugten Vorschlag, sprich zip und pdf als Beispiel.

Überwacht dass dann einen Ordner und wo definiere ich den Ordner wo eine Datei hin-verschoben wird.

Sory dass ich noch mal nachfragen musste, dass erschließt sich mir noch nicht ganz.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

theom schrieb:

Kann ich auch mehrere Dateiendungen hinterlegen in Deinem zweiten und von Dir bevorzugten Vorschlag, sprich zip und pdf als Beispiel.

Ich würde case nehmen.

Überwacht dass dann einen Ordner und wo definiere ich den Ordner wo eine Datei hin-verschoben wird.

Lies das Skript, bitte.

Sory dass ich noch mal nachfragen musste, dass erschließt sich mir noch nicht ganz.

Das fällt mir schwer zu glauben, denn die beiden Informationen sind sehr einfach zu entnehmen. Es ist sowieso sinnvoll, nicht einfach etwas zu übernehmen, was Du irgendwo findest. Also lohnt sich die Beschäftigung mit den Manpages der Befehle.

Antworten |