Kopieren oder Verschieben von "vielen" Dateien klappt nicht

phoneuser

Neuer User
Mitglied seit
10 Jan 2011
Beiträge
49
Punkte für Reaktionen
0
Punkte
0
Hallo :p,

wusste nicht so recht, wo ich dieses Thema platzieren sollte.. nun ist es hier gelandet.

Ich habe ein Shellskript, dass per Crontab-Eintrag alle 12 Stunden etwa 5000 jpg-Dateien von einem Ordner "img" auf dem USB-Stick in einen anderen Ordner "temp" (ebenfalls auf dem USB-Stick) verschieben soll. Das Kommando "mv *.jpg" funktioniert bei so vielen Dateien nicht!

Es funktioniert alles ohne Probleme, wenn sich in dem Ordner "img" etwa 2000 Dateien befinden.

Das Verhalten ist nicht normal, weil dann der mv-Befehl mit der Meldung "mv: not found" kommentiert wird. Auch alle anderen Linux-Kommandos werden dann nicht erkannt.

Gibt es in freetz womöglich eine Grenze für die Anzahl der zu kopierenden Dateien?
 
Zuletzt bearbeitet:
Es gibt in Freetz keine Grenze für die Anzahl der zu kopierenden Dateien.

Ist das wirklich ganz exakt die Meldung?
Wie sieht ein strace davon aus?
 
Die Meldung sieht so aus:
"-sh: mv: not found"

Es sieht so aus, als würde die Shell durch die fehlgeschlagene Vershiebeaktion aus dem Tritt kommen, denn sogar einfache Kommandozeilenbefehle wie z.B. "ls, man, cp ..." werden dann nicht erkannt.

Ich habe das move-Kommando mittlerweile ersetzt durch "find ... -exec mv {} ..." und das Verschieben vieler Dateien klappt ohne Probleme.
 
Der Dateiname setzt sich aus Datum und Uhrzeit zusammen:

2011041310151111.jpg

Könnte es sein, dass die Verarbeitung durcheinander kommt, weil in das Quellverzeichnis während des "move" weiterhin neue Dateien geschrieben werden? Es werden ja weiterhin Bilder von der Cam in das Verzeichnis übertragen, während das Verschieben stattfindet.
 
Die Verarbeitung kommt nicht durcheinander, weil weitere Dateien geschrieben werden. Es könnte allerdings Probleme geben, wenn gerade eine Datei erstellt wird, möglicherweise ist diese nachher nicht vollständig, es kommt darauf an, was genau passiert, unter anderem auch darauf, ob das mv-Kommando die Dateien verschiebt oder kopiert.

Vorher hatte ich nur 8 Ziffern in den Dateinamen, jetzt habe ich mal Dateien mit 16 Ziffern angelegt, damit tritt bei mir das Problem auch auf.

Anscheinend handelt es sich um einen Fehler im Kernel, vielleicht auch in der Busybox.
 
Die Verarbeitung kommt nicht durcheinander, weil weitere Dateien geschrieben werden. Es könnte allerdings Probleme geben, wenn gerade eine Datei erstellt wird, möglicherweise ist diese nachher nicht vollständig, es kommt darauf an, was genau passiert, unter anderem auch darauf, ob das mv-Kommando die Dateien verschiebt oder kopiert.

Vorher hatte ich nur 8 Ziffern in den Dateinamen, jetzt habe ich mal Dateien mit 16 Ziffern angelegt, damit tritt bei mir das Problem auch auf.

Anscheinend handelt es sich um einen Fehler im Kernel, vielleicht auch in der Busybox.

Ich tippe eher darauf, das die maximale Länger einer Kommandozeile überschritten wird. Die shell expandiert ja "*.jpg" und ruft dann "mv" (oder was auch immer) auf. Die Lösung mit "find -exec" ist aber mit Sicherheit extrem langsam. Gibt es kein "xargs" auf der box?

ciao
Bastian
 
Natürlich liegt es an der Länge der Kommandozeile, aber die richtige Meldung wäre "Argument list too long" und nicht "not found".
Also übergibt entweder die Busybox in diesem Fall die Parameter nicht richtig, oder der Kernel meldet einen falschen Error-Code zurück.
 
Mittlerweile habe ich aus diversen Postings im Internet erfahren, dass "xargs" schneller ist als "find ...exec". Es gibt ein xargs auf der Box, aber wohl etwas abgespeckt. Ich habe es mit diesem Befehl probiert, aber hat nicht funktioniert:

find . -iname "*.jpg" -type f | xargs -0 -r mv {} /temp/

Die Files wurden nicht verschoben. Wie muss das Kommando denn aussehen?
 
Hast Du tatsächlich irgendwo eine Anleitung gefunden, wo das so steht?
Kam eine Fehlermeldung?
Hast Du mal die Anleitungen durchgelesen, was die verwendeten Optionen bedeuten?
 
Den Befehl habe ich irgendwo aus dem Netz...

Hier der xargs aus AVM-Wiki:
$ xargs --help

BusyBox v1.12.4 (2010-05-31 07:47:35 CEST) multi-call binary
Usage: xargs [OPTIONS] [COMMAND] [ARGS...]
Options:
-p Ask user whether to run each command
-r Do not run command if input is empty
-0 Input is separated by NUL characters
-t Print the command on stderr before execution
-e[STR] STR stops input processing (default _)
-n N Pass no more than N args to COMMAND
-s N Pass command line of no more than N bytes
-x Exit if size is exceeded

Womöglich ist für mein Vorhaben keiner dieser Parameter notwendig, außer vielleicht das "-r".

Die Frage ist, wie ich das xargs einsetzen kann, um das verschieben von Dateien zu bewerkstelligen???
 
Ein Problem ist, daß bei Deinem Beispiel die Optionen von find und von xargs nicht zusammen passen. Ein weiteres Problem ist, daß die Optionen und Parameter von xargs nicht zusammen passen.

Das größere Problem aber ist, daß das Busybox mv die Namen der Dateien vor dem Zielverzeichnis erwartet und Busybox xargs die Namen so nicht liefern kann.
Der Umweg über ein Shell Skript könnte helfen.
 
Wenn der Befehl "find-exec" funktioniert, warum dann nicht auch ein "find-xargs"?

Das funktioniert:
$ find . -name *.jpg -exec ls {} \;

warum dieser nicht?
$ find . -name *.jpg | xargs mv {} /temp/ \;
 
Das funktioniert:
$ find . -name *.jpg -exec ls {} \;
Das funktioniert genau dann, wenn sich höchstens eine Datei mit Endung .jpg im aktuellen Verzeichnis befindet.
warum dieser nicht?
$ find . -name *.jpg | xargs mv {} /temp/ \;
Weil das Programm xargs nicht so geschrieben ist, daß das funktionieren würde. Es steht Dir aber frei, ein Programm zu schreiben, das genau so aufgerufen wird. Zur Vermeidung von Missverständnissen solltest Du ein solches Programm aber nicht xargs nennen.
Wenn der Befehl "find-exec" funktioniert, warum dann nicht auch ein "find-xargs"?
Aus der Frage lese ich mal heraus, dass Du irgendwo Beispiele gesehen hast, ohne deren Bedeutung zu verstehen. Dann hast Du diese Beispiele auch noch abgewandelt, erst Recht ohne zu wissen, was es bewirkt.
Das Programm find hat eine Option -exec. Dagegen ist xargs ein anderes Programm, das aber häufig in Verbindung mit find eingesetzt wird.
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.