Move Problem

root@linux

root@linux

Grünschnabel
Hallo !

Ich habe ein Problem und weiß nicht wie ich es zu lösen habe. Ich möchte eine Reorganisation von Ordnern machen, die älter als 1 Tag sind und das Muster "test_bis*" haben. Diese sollen dann verschoben werden (in einen anderen Ordner).

Nun habe ich fleißig an einem Skript gebastelt, dass auch meine betreffenden Ordner "moved", jedoch bekomme ich beim ausführen des Skriptes eine irritierende Meldung. "Datei oder Verzeichnis nicht gefunden". Warum bekomme ich dies in der Shell angezeigt obwohl er alles macht !!??

Hier das Skript:

#!/bin/ksh

DEPLOY=~/test
MUSTER=$DEPLOY/muster

#Alle Ordner die aelter als 1 Tag sind landen im Ordner: "reorg"
REORG=$DEPLOY/reorg

#aelter als (Tage):
DAYS=1

cd $MUSTER
find -type d -name "test_bis*" -mtime +$DAYS -exec mv {} $REORG \;

:hilfe2:
 
Arg, ich Depp. Hinter find musst Du noch das Verzeichnis angeben, also

Code:
find $MUSTER -type d -name "test_bis*" -mtime +$DAYS -exec mv {} $REORG \;

oder

Code:
find . -type d -name "test_bis*" -mtime +$DAYS -exec mv {} $REORG \;

wenn Du vorher in das Verzeichnis gewechselt bist.
 
Move

Hallo Phorus,

ich habe das Verzeichnis angegeben mit '.', hatte mich nur vertippt!! Ist also genauso wie du es im 2. Zitat sagst aufgebaut !! Trotzdem findet er das Verzeichnis und moved es aber gibt trotzdem eine Fehlermeldung auf der Konsole aus !! *komisch*!!
 
Hmm, das Problem ist, das zuerst die gefundenen Verzeichnisse bewegt werden und anschliessend "find" sich darüber aufregt, dass die gefundenen Verzeichnisse nicht mehr da sind, da sie ja bewegt wurden.
 
Move

Ja, das habe ich mir auch gedacht aber er muss doch erstmal eine gefundene Menge haben, die er dann "sequentiell" an den exec weitergibt oder ? Ich meine sonst wäre dies doch unsinn oder ? Also ich weiß im Moment auch nicht weiter! Weil der find ohne die anderen Kommandos wird auch richtig ausgeführt (habe ich getestet). hmmmm ... trotzdem Danke !!

Muss wohl noch ein wenig basteln *g*!
 
Hallo
Also deine Fehlermeldung ist logisch und normal.
Was du als trotzdem ausgeführt ansiehst, sind nicht die Fehlermeldungen.
Versetz dich in die Situation wie find mit exec hier arbeitet, und es wird klar.

find sucht nach deinen Kriterien die entsprechenden Ordner und übergibt diese als Argumentliste an -exec mv.
Dabei werden zuerst die Ordner in der ersten Ebene gefunden, dann steigt find eine Ebene höher und findet eventuell wieder Unterordner die zutreffen. Liegen diese nun unterhalb eines Ordners der weiter vorn als Argument schon in der Liste für mv steht, so wird mv zuerst den oberen Ordner samt Unterordner verschieben. Das bedeutet wenn der in der Argumentliste stehende Unterordner an die Reihe kommt findet mv diesen nicht mehr.
Ausserdem kann es sein, wenn deine Option auf den Oberordner, aber auf einen in diesem befindlichen Ordner nicht zutrifft, dass das ergebnis nicht deinen Wünschen entspricht.
Das musst du aber selbst wissen, was dann passieren soll - mv verschiebt ja alle Unterordner mit.
mv beginnt erst dann zu arbeiten, wenn die Argumentliste fertig (find also fertig ist) zusammengestellt ist.
Die Fehlermeldung kommt dann also von mv.
Abhilfe kann hier eventuell die Option -depth schaffen.
Deshalb kann es bei derartigen Konstrukten auch zu der allseits beliebten ;) Fehlermeldung:
Argumentlist is to long
kommen, wenn zu viele dateien gefunden werden.

deshalb solltest du besser mit find ... |xargs arbeiten, da das für jedes Argument einen eigenen Prozess startet.

Hoffe die Erklärung hilft dir ein wenig weiter.
Bei weiteren Fragen, bin ich gern bereit zu erklären, so ich das kann. ;)
Gruß Wolfgang
 
Phorus schrieb:
Arg, ich Depp. Hinter find musst Du noch das Verzeichnis angeben, also

Code:
find $MUSTER -type d -name "test_bis*" -mtime +$DAYS -exec mv {} $REORG \;

oder

Code:
find . -type d -name "test_bis*" -mtime +$DAYS -exec mv {} $REORG \;

wenn Du vorher in das Verzeichnis gewechselt bist.


Kenne ich auch und bin noch nicht dahintergekommen warum der Fehler kommt.

Eine unelegante Lösung um die Fehlermeldung zu vermeiden wäre:

Code:
for i in `find . -type d -name "test_bis*" -mtime +$DAYS"`; do
    mv $i $REORG
done

belubaba
 
Ich würde die Option "-depth 1" empfehlen.

Gruss, Phorus
 
Wolfgang_1 schrieb:
Hallo
Also deine Fehlermeldung ist logisch und normal.
Was du als trotzdem ausgeführt ansiehst, sind nicht die Fehlermeldungen.
Versetz dich in die Situation wie find mit exec hier arbeitet, und es wird klar.

find sucht nach deinen Kriterien die entsprechenden Ordner und übergibt diese als Argumentliste an -exec mv.
Dabei werden zuerst die Ordner in der ersten Ebene gefunden, dann steigt find eine Ebene höher und findet eventuell wieder Unterordner die zutreffen. Liegen diese nun unterhalb eines Ordners der weiter vorn als Argument schon in der Liste für mv steht, so wird mv zuerst den oberen Ordner samt Unterordner verschieben. Das bedeutet wenn der in der Argumentliste stehende Unterordner an die Reihe kommt findet mv diesen nicht mehr.
Ausserdem kann es sein, wenn deine Option auf den Oberordner, aber auf einen in diesem befindlichen Ordner nicht zutrifft, dass das ergebnis nicht deinen Wünschen entspricht.
Das musst du aber selbst wissen, was dann passieren soll - mv verschiebt ja alle Unterordner mit.
mv beginnt erst dann zu arbeiten, wenn die Argumentliste fertig (find also fertig ist) zusammengestellt ist.
Die Fehlermeldung kommt dann also von mv.
Abhilfe kann hier eventuell die Option -depth schaffen.
Deshalb kann es bei derartigen Konstrukten auch zu der allseits beliebten ;) Fehlermeldung:
Argumentlist is to long
kommen, wenn zu viele dateien gefunden werden.

deshalb solltest du besser mit find ... |xargs arbeiten, da das für jedes Argument einen eigenen Prozess startet.

Hoffe die Erklärung hilft dir ein wenig weiter.
Bei weiteren Fragen, bin ich gern bereit zu erklären, so ich das kann. ;)
Gruß Wolfgang


Hallo Wolfgang!

Danke für deinen Tip aber die Fehlermeldung kommt wohl vom "find:" komischerweise! das zeigt er mir auch an ! Aber werde jetzt erstmal die Methode mit der for schleife ausprobieren mal schauen ob das ohen Fehler funktioniert !!

Gruß
 
Move Problem Beseitigt

Also... ich danke allen !! Das Problem habe ich in den Griff bekommen, es musste nur die Option -depth mit angegeben werden (hinter find . )!! Jetzt funktioniert es auch ohne Fehlermeldung.
 
root@linux schrieb:
Also... ich danke allen !! Das Problem habe ich in den Griff bekommen, es musste nur die Option -depth mit angegeben werden (hinter find . )!! Jetzt funktioniert es auch ohne Fehlermeldung.

Sach ich doch :D
*gg*

Trotzdem ist die Variante mit xargs besser, da du Probleme bekommst, wenn in den Ordnernamen z.B. Leerzeichen vorkommen.
Das geht aber mit der
find ...-print0|xargs -0 -n1 mv {} /somwhere

Gruß Wolfgang
 
Zuletzt bearbeitet:
Wolfgang_1 schrieb:
da du Probleme bekommst, wenn in den Ordnernamen z.B. Leerzeichen vorkommen
...oder wie bereits angesprochen die Argumentenliste zu lang ist :rtfm:
 

Ähnliche Themen

Prblem mit zeilenweises auslesen von Datei und schreiben nach mysql

Mein Server versendet SPAM in Massen

Archivierungsprogramm

script backup löschen

CMS Problem [php]

Zurück
Oben