[linux-l] Probleme mit Cleanupscript

Jens Dreger jens.dreger at physik.fu-berlin.de
Di Jul 8 16:16:32 CEST 2003


On Tue, Jul 08, 2003 at 03:24:50PM +0200, Dani Oderbolz wrote:
>
> Hmm, wieder mal ein Quotingproblem.
> Auf jeden Fall vielen Dank, das hat geholfen.
> Nur steht nun schon das n?chste Problem an:
> ich m?chte in meiner Konfiguration einstellen k?nnen, was denn mit
> alten Dateien passiert.
> Ich mache dazu folgendes im Konfigfile:
> 
> # Verzeichnis    Pattern    Suchtiefe    Zeit_in_Tagen Kommando ( \{\} 
> bezeichnet die aktuelle Datei)
> /home/admin/log    *    1    30    "/bin/mv \{\} /home/admin/log/old/ \;"
> 
> Das Script macht dann dieses:
> find "${DIRECTORY}" -name "${PATTERN}" -maxdepth "${MAXDEPTH}" -mtime 
> +"${MTIME}" -exec "${COMMAND}"
> 
> Die Idee w?re also, dass alle Dateien in /home/admin/log 
> (Unterverzeichnisse werden ignoriert), die ?lter als 30 Tage sind,
> nach /home/admin/log/old kopiert werden.
> Das script findet (endlich :-) die Dateien, doch find f?hrt das Kommando 
> nicht aus, sondern sagt das:
> find: "/bin/mv /home/admin/log/backup_files.sh.bak /home/admin/log/old/ 
> ;": Datei oder Verzeichnis nicht gefunden
> (Und so weiter f?r jede gefundene Datei).
> 
> Wo liegt dieser Hund begraben?

Erstmal wird "/bin/mv \{\} /home/admin/log/old/ \;" als ein Argument
an find uebergeben. find moechte aber einzelne Argumente ageschlossen
von einem ; haben. Hier ein kleines Testscript, mit dem Du die Fehler
finden solltest (ich weiss natuerlich nicht, wie Du Deine config
einliest...):

-------------8<---------------------------------------------
#!/bin/bash
function showargs {
    I=1
    for ARG in "$@"; do printf "%02d %s\n" $[I++] "$ARG"; done
}

read DIRECTORY PATTERN MAXDEPTH MTIME COMMAND <<EOF
/var/tmp    *    1    30    echo /bin/mv {} /home/admin/log/old/ ;
EOF
showargs find "${DIRECTORY}" -name "${PATTERN}" \
    -maxdepth "${MAXDEPTH}" -mtime +"${MTIME}" -exec ${COMMAND}
-------------8<------------------------------------------------

So wie es da steht, geht es bei mir:

~> ./script.sh 
01 find
02 /var/tmp
03 -name
04 *
05 -maxdepth
06 1
07 -mtime
08 +30
09 -exec
10 echo
11 /bin/mv
12 {}
13 /home/admin/log/old/
14 ;

Wenn Du im config-File "/bin/mv \{\} /home/admin/log/old/ \;"
schreibst und bei find "${COMMAND}", kommt da heraus:

~> ./script.sh 
01 find
02 /var/tmp
03 -name
04 *
05 -maxdepth
06 1
07 -mtime
08 +30
09 -exec
10 "/bin/mv {} /home/admin/log/old/ ;"

find versucht also das Programm "/bin/mv {} /home/admin/log/old/ ;"
auszufuehren, welches es nicht gibt.

Das Weglasssen der quotes im config-File beim Command ist natuerlich
nicht so toll, weil es damit in der letzten Spalte stehe muss und man
sich auf das Verhalten von read verlaesst, den Rest der Zeile in die
letzte Variable zu stecken. Aber wenn Du es quotest und mit read
liest, dann ueberleben die quotes. So richtig stabil sieht das alles
nicht aus ;)

Gruss,

Jens.



Mehr Informationen über die Mailingliste linux-l