Da Dateien per Script zu löschen nicht unproblematisch ist, möchte ich eine Ausgabe im Script haben, was gelöscht wurde. Problem ist, dass ein Script automatisch Dateien anlegt und ich gemerkt habe, dass in seltenen Fällen der komplette Pfad zu lang wird. Ich habe daher die cut-Parameter (siehe unten) auf 30 begrenzt. Somit existieren Verzeichnisse deren Namen genauso beginnen aber länger sind und die möchte ich löschen. also zB (ohne jetzt meine Längen zu berücksichtigen) hatte vorher das Script test_bla_123 definiert und nun nur mehr test_bla. Somit müsste ich nach einem Verzeichnis test_bla suchen können und dann das gefundene Verzeichnis löschen können. Die Suche ist auf die Verzeichnisse eingeschränkt, die betroffen sein können. Grundsätzlich funktioniert es auch. Etwas Bauchweh habe ich mit dem Quoting. In diesem Fall kann garantiert werden, dass keine Leerzeichen vorkommen. Wie müsste ich quoten, wenn das Verzeichnis Leerzeichen enthält? Nochmals meine bereits o.a. Frage, wie erreiche ich eine Kontrollausgabe beim Ablauf des Scripts? TEST_DIR="$MYDIR""/TEST_"`basename \`pwd\` | cut -c9-30` find $MYDIR -type d -regex ".*$TEST_DIR.*" -print0 | xargs -r -0 rm -r Al -- Um die Liste abzubestellen, schicken Sie eine Mail an: suse-linux-unsubscribe@suse.com Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: suse-linux-help@suse.com
Nochmals meine bereits o.a. Frage, wie erreiche ich eine Kontrollausgabe beim Ablauf des Scripts?
Wie wäre es mit einem -v für rm(1)? Gruß Martin -- Um die Liste abzubestellen, schicken Sie eine Mail an: suse-linux-unsubscribe@suse.com Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: suse-linux-help@suse.com
Am Mittwoch, 28. Juni 2006 17:44 schrieb Martin Schröder:
Nochmals meine bereits o.a. Frage, wie erreiche ich eine Kontrollausgabe beim Ablauf des Scripts?
Wie wäre es mit einem -v für rm(1)?
Sorry, ich war zu ungenau mit meiner Frage. rm -v listet jede einzelne Datei. Ich möchte, dass aber nur die gelöschten Verzeichnisse gelistet werden, die einzelnen Dateien sind hier uninteressant. Al -- Um die Liste abzubestellen, schicken Sie eine Mail an: suse-linux-unsubscribe@suse.com Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: suse-linux-help@suse.com
Hallo, Am Mit, 28 Jun 2006, Al Bogner schrieb:
Etwas Bauchweh habe ich mit dem Quoting. In diesem Fall kann garantiert werden, dass keine Leerzeichen vorkommen. Wie müsste ich quoten, wenn das Verzeichnis Leerzeichen enthält?
Nochmals meine bereits o.a. Frage, wie erreiche ich eine Kontrollausgabe beim Ablauf des Scripts?
TEST_DIR="$MYDIR""/TEST_"`basename \`pwd\` | cut -c9-30` find $MYDIR -type d -regex ".*$TEST_DIR.*" -print0 | xargs -r -0 rm -r
pwd="`pwd`" TEST_DIR="${MYDIR}/TEST_`basename \"$pwd\" | cut -c9-30`" find "$MYDIR" ... Oder: TEST_DIR="${MYDIR}/TEST_$(basename $(pwd) | cut -c9-30)" find "$MYDIR" ... -dnh -- Friendship knows no debts. -- Um die Liste abzubestellen, schicken Sie eine Mail an: suse-linux-unsubscribe@suse.com Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: suse-linux-help@suse.com
Am Mittwoch, 28. Juni 2006 17:54 schrieb David Haller: Hallo David,
Am Mit, 28 Jun 2006, Al Bogner schrieb:
Etwas Bauchweh habe ich mit dem Quoting. In diesem Fall kann garantiert werden, dass keine Leerzeichen vorkommen. Wie müsste ich quoten, wenn das Verzeichnis Leerzeichen enthält?
Nochmals meine bereits o.a. Frage, wie erreiche ich eine Kontrollausgabe beim Ablauf des Scripts?
TEST_DIR="$MYDIR""/TEST_"`basename \`pwd\` | cut -c9-30` find $MYDIR -type d -regex ".*$TEST_DIR.*" -print0 | xargs -r -0 rm -r
pwd="`pwd`" TEST_DIR="${MYDIR}/TEST_`basename \"$pwd\" | cut -c9-30`" find "$MYDIR" ...
Oder:
TEST_DIR="${MYDIR}/TEST_$(basename $(pwd) | cut -c9-30)" find "$MYDIR" ...
Danke, Wie könnte man noch absichern, dass die Variablen nicht leer sein dürfen, dass also nicht als User ein rm -r / entstehen kann. Die Variable $MYDIR wird beim Aufruf des Scripts übergeben. Ich lasse das Script abbrechen, wenn kein Parameter übergeben wird bzw. das angegebene Verzeichnis nicht existiert, bin mir aber unsicher, ob nicht doch irgendwie eine Situationen entstehen könnte, sodass rm -r / entstehen kann, speziell wenn Änderungen am Script vorgenommen werden und man dann bei Tests etwas übersieht. Eine weitere Absicherung würde mich beruhigen ;-) Normalerweise verwende ich bei rm in Scripts einen Teil, der nicht aus einer Variable besteht. Das ist aber hier nicht möglich. Al -- Um die Liste abzubestellen, schicken Sie eine Mail an: suse-linux-unsubscribe@suse.com Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: suse-linux-help@suse.com
Wie könnte man noch absichern, dass die Variablen nicht leer sein dürfen, dass also nicht als User ein rm -r / entstehen kann.
[ ! -z "$var" ] && <dein rm Befehl> Alternativ [ $var != "/" ] && <dein rm Befehl> -- Um die Liste abzubestellen, schicken Sie eine Mail an: suse-linux-unsubscribe@suse.com Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: suse-linux-help@suse.com
Hallo, Am Mit, 28 Jun 2006, Al Bogner schrieb:
Am Mittwoch, 28. Juni 2006 17:54 schrieb David Haller:
Am Mit, 28 Jun 2006, Al Bogner schrieb:
Etwas Bauchweh habe ich mit dem Quoting. In diesem Fall kann garantiert werden, dass keine Leerzeichen vorkommen. Wie müsste ich quoten, wenn das Verzeichnis Leerzeichen enthält?
Nochmals meine bereits o.a. Frage, wie erreiche ich eine Kontrollausgabe beim Ablauf des Scripts?
TEST_DIR="$MYDIR""/TEST_"`basename \`pwd\` | cut -c9-30` find $MYDIR -type d -regex ".*$TEST_DIR.*" -print0 | xargs -r -0 rm -r
pwd="`pwd`" TEST_DIR="${MYDIR}/TEST_`basename \"$pwd\" | cut -c9-30`" find "$MYDIR" ...
Oder:
TEST_DIR="${MYDIR}/TEST_$(basename $(pwd) | cut -c9-30)" find "$MYDIR" ... [..] Wie könnte man noch absichern, dass die Variablen nicht leer sein dürfen, dass also nicht als User ein rm -r / entstehen kann.
test -z "$TEST_DIR" && exit 1 Hierbei ist aber das quoten essentiell! Sonst sieht die shell ein 'test -z && exit 1' soll aber ein 'test -z "" && exit 1' sehen. Alternativ und "unempfindlicher": test -n "$TEST_DIR" || exit 1 test "x${TEST_DIR}" = "x" && exit 1 und als zusaetzlichen(!) Test noch: test "x${TEST_DIR}" != "x/" || exit 1 Achso, zum ausgeben noch eine Variante: { find ... -print0 | tee /dev/stderr | xargs ... } 2>&1 | tr '\0' '\n' HTH, -dnh --
Write the code like you are going to lose your memory in six months. Most people would say I write code like I've already lost my mind. Is that the same thing? -- Randal L. Schwartz
-- Um die Liste abzubestellen, schicken Sie eine Mail an: suse-linux-unsubscribe@suse.com Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: suse-linux-help@suse.com
Am Donnerstag, 29. Juni 2006 11:46 schrieb David Haller: Hallo,
Am Mit, 28 Jun 2006, Al Bogner schrieb:
Am Mittwoch, 28. Juni 2006 17:54 schrieb David Haller:
Am Mit, 28 Jun 2006, Al Bogner schrieb:
Etwas Bauchweh habe ich mit dem Quoting. In diesem Fall kann garantiert werden, dass keine Leerzeichen vorkommen. Wie müsste ich quoten, wenn das Verzeichnis Leerzeichen enthält?
Nochmals meine bereits o.a. Frage, wie erreiche ich eine Kontrollausgabe beim Ablauf des Scripts?
TEST_DIR="$MYDIR""/TEST_"`basename \`pwd\` | cut -c9-30` find $MYDIR -type d -regex ".*$TEST_DIR.*" -print0 | xargs -r -0 rm -r
pwd="`pwd`" TEST_DIR="${MYDIR}/TEST_`basename \"$pwd\" | cut -c9-30`" find "$MYDIR" ...
Oder:
TEST_DIR="${MYDIR}/TEST_$(basename $(pwd) | cut -c9-30)"
Ich bin mir nicht sicher, ob das so passt.Ich habe es einfach in meinem Script ersetzt, das ja vorher das tat, was ich wollte und danach wurde das Vereichnis "darüber" auch gelöscht. Die 1. Variante muss ich noch testen. Mit dem u.a. Vorschlag kann ich die Auswirkungen ja nun kontrollieren, ohne wirklich zu löschen. Es ist kein Problem, wenn etwas ungewollt gelöscht wird, es ist aber zeitaufwendig richtig zurückzusichern.
find "$MYDIR" ...
[..]
Wie könnte man noch absichern, dass die Variablen nicht leer sein dürfen, dass also nicht als User ein rm -r / entstehen kann.
test -z "$TEST_DIR" && exit 1
Nun ja, das mache ich ja schon, aber wenn $TEST_DIR=\, dann wird munter darauf los gelöscht und der User muss neu angelegt werden.
Hierbei ist aber das quoten essentiell! Sonst sieht die shell ein 'test -z && exit 1' soll aber ein 'test -z "" && exit 1' sehen.
Alternativ und "unempfindlicher":
test -n "$TEST_DIR" || exit 1 test "x${TEST_DIR}" = "x" && exit 1
und als zusaetzlichen(!) Test noch:
Ja, in dieser Richtung überlege ich.
test "x${TEST_DIR}" != "x/" || exit 1
Wofür steht das x oder ist das nur eine Sicherheismaßnahme?
Achso, zum ausgeben noch eine Variante:
{ find ... -print0 | tee /dev/stderr | xargs ... } 2>&1 | tr '\0' '\n'
Genau sowas wollte ich. Ist ja simpel, man muss nur daran denken. Al -- Um die Liste abzubestellen, schicken Sie eine Mail an: suse-linux-unsubscribe@suse.com Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: suse-linux-help@suse.com
Hallo, Am Don, 29 Jun 2006, Al Bogner schrieb:
Am Donnerstag, 29. Juni 2006 11:46 schrieb David Haller:
Hallo,
Am Mit, 28 Jun 2006, Al Bogner schrieb:
Am Mittwoch, 28. Juni 2006 17:54 schrieb David Haller:
Am Mit, 28 Jun 2006, Al Bogner schrieb:
Etwas Bauchweh habe ich mit dem Quoting. In diesem Fall kann garantiert werden, dass keine Leerzeichen vorkommen. Wie müsste ich quoten, wenn das Verzeichnis Leerzeichen enthält?
Nochmals meine bereits o.a. Frage, wie erreiche ich eine Kontrollausgabe beim Ablauf des Scripts?
TEST_DIR="$MYDIR""/TEST_"`basename \`pwd\` | cut -c9-30` find $MYDIR -type d -regex ".*$TEST_DIR.*" -print0 | xargs -r -0 rm -r
pwd="`pwd`" TEST_DIR="${MYDIR}/TEST_`basename \"$pwd\" | cut -c9-30`" find "$MYDIR" ...
Oder:
TEST_DIR="${MYDIR}/TEST_$(basename $(pwd) | cut -c9-30)" find "$MYDIR" ...
Ich bin mir nicht sicher, ob das so passt.Ich habe es einfach in meinem Script ersetzt, das ja vorher das tat, was ich wollte und danach wurde das Vereichnis "darüber" auch gelöscht. Die 1. Variante muss ich noch testen. Mit dem u.a. Vorschlag kann ich die Auswirkungen ja nun kontrollieren, ohne wirklich zu löschen. Es ist kein Problem, wenn etwas ungewollt gelöscht wird, es ist aber zeitaufwendig richtig zurückzusichern.
Hm. Ersetze mal das '| cut -c9-30' durch ein '| cat'. 'cut -c' ist eben generell anfaellig, falls Zeichenpositionen nicht mehr passen. Wie sieht denn `pwd` aus? Und was davon willst du wegschneiden?
[..]
Wie könnte man noch absichern, dass die Variablen nicht leer sein dürfen, dass also nicht als User ein rm -r / entstehen kann.
test -z "$TEST_DIR" && exit 1
Nun ja, das mache ich ja schon, aber wenn $TEST_DIR=\, dann wird munter darauf los gelöscht und der User muss neu angelegt werden.
Das war nur die Antwort auf den ersten Teil: "nicht leer" ;)
Hierbei ist aber das quoten essentiell! Sonst sieht die shell ein 'test -z && exit 1' soll aber ein 'test -z "" && exit 1' sehen.
Alternativ und "unempfindlicher":
test -n "$TEST_DIR" || exit 1 test "x${TEST_DIR}" = "x" && exit 1
und als zusaetzlichen(!) Test noch:
Ja, in dieser Richtung überlege ich.
test "x${TEST_DIR}" != "x/" || exit 1
Wofür steht das x oder ist das nur eine Sicherheismaßnahme?
Letzteres.
Achso, zum ausgeben noch eine Variante:
{ find ... -print0 | tee /dev/stderr | xargs ... } 2>&1 | tr '\0' '\n'
Genau sowas wollte ich. Ist ja simpel, man muss nur daran denken.
*g* -dnh -- 119: Dateimanager cd, ls, cp, mv (Ulli Horlacher) -- Um die Liste abzubestellen, schicken Sie eine Mail an: suse-linux-unsubscribe@suse.com Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: suse-linux-help@suse.com
participants (4)
-
Al Bogner
-
David Haller
-
Dominik Klein
-
Martin Schröder