[linux-l] Probleme mit Cleanupscript

Ihno Krumreich ihno at lst.de
Do Jul 10 08:18:02 CEST 2003


On Tue, Jul 08, 2003 at 04:16:32PM +0200, Jens Dreger wrote:
> 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 Versucht find aber nur deswegen, weil "${COMMAND}" in Hochkomma
steht. Laesst man die Hochkommas an dieser Stelle weg, wird es ganz
normal ausgefuehrt (kann man mit obigem Programm schoen sehen).

> 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 ;)

Die Hochkomma in der Konfig Datei haben null wirkung (zumindest wenn sie
ueber read eingelesen werden. Sie werden dann als "normale" Zeichen
eingelesen). Man kann sie auch weg lassen. Das kann man an der Ausgabe
von untestehendem Script sehen.

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

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

Ihno




Mehr Informationen über die Mailingliste linux-l