wie in jedem Ordner eine xyz-Datei erzeugen

stefkey

Member
Hallo,
ich möchte gerne in jedem Unterordner von /var/www/ eine Datei beispiel.txt erzeugen. Außerdem soll das Datum der jeweiligen Ordner nicht verändert werden. Das erzeugen der Dateien geht wohl mit touch, aber wie bekomme ich es hin das die Verzeichnis Timestamps nicht verändert werden? Nur mit einem Script oder? Kann mir jemand helfen?
 
Quick'n'Dirty Script, ungetestet(!):
Code:
#!/bin/bash
for DIR in `find /var/www -mindepth 1 -type d -print0 | xargs -0`
do
touch -r $DIR /tmp/TIMESTAMP
touch $DIR/beispiel.txt
touch -r /tmp/TIMESTAMP $DIR
rm -f /tmp/TIMESTAMP
done
exit 0
 
Last edited by a moderator:
Du kannst den timestamp des Ordners lesen, die Datei schreiben und ihn wiederherstellen - ebenfalls mit touch.
 
Krass! Es geht auf Anhieb! Wahnsinn, DANKE!
Und wenn die Datei beispiel.txt nur in Verzeichnissen mit weiteren Unterverzeichnissen erstellt werden soll? Also quasi im letzten Unterverzeichnis keine Beispiel.txt erstellt werden soll. Das ist das wahrscheinlich nicht mit 1-2 Zeilen ergänzt, da ja mit "find /Users/Nicole/Downloads/testdisk-6.13-WIP.win -type d -print0 | xargs -0" nichts zu machen ist... oder hast du da wieder eine Quick'n'Dirty Lösung im Kopf?
 
Ungetestet(!) und unoptimiert:
Code:
#!/bin/bash
for DIR in `find /var/www -mindepth 1 -type d -print0 | xargs -0`
do
  if [ -d "$DIR/*" ]
  then
    touch -r $DIR /tmp/TIMESTAMP
    touch $DIR/beispiel.txt
    touch -r /tmp/TIMESTAMP $DIR
    rm -f /tmp/TIMESTAMP
  fi
done
exit 0
 
hmm, ich verstehe. Sollte also auch machbar sein. Leider wird jetzt keine Datei mehr erstellt. Ich denke das was hinter if steht funktioniert nicht.
if [ -d "$DIR/*" ]

Die find Ausgabe sieht ja so aus:
/v1
/v1/v2
/v1/v2/v3
/v1/v2/v3/v4

und nur in v1 und v2 und v3 soll die Datei erstellt werden. Aber wie kann man das abfangen?!?

Noch ne Idee jemand?
 
kann man in das if Argument einen Befehl einbauen?
Zb "find $DIR -type d"

Und nur wenn hier etwas rauskommt gehts in die if-Schleife?
 
tja, da fehlen mir einfach die Kenntnisse. Ich habe folgendes probiert:
if [ `find $DIR -type d` ]

Aber das ists natürlich nicht. Der find $DIR bringt ja nur dann etwas wenn es ein Verzeichnis unterhalb von $DIR gibt. Und genau das will ich ja wissen und entsprechend dann weitergehen. Das muss doch gehen, oder?
 
Nicht schön, aber sollte funktionieren:
Code:
#!/bin/bash
for DIR in `find /var/www -mindepth 1 -type d -print0 | xargs -0`
do
  I="`find $DIR -mindepth 1 -maxdepth 1 -type d -print0 | xargs -0`"
  if [ ! -z "$I" ]
  then
    touch -r $DIR /tmp/TIMESTAMP
    touch $DIR/beispiel.txt
    touch -r /tmp/TIMESTAMP $DIR
    rm -f /tmp/TIMESTAMP
  fi
done
exit 0
 
und wie es funktioniert! Programmieren ist doch toll, schade das ich es nicht kann :-(

Viiiiielen Dank an alle und ganz besonderen Dank an Joe User für deine Zeit und Mühe! Es erleichtert ernorm und gelernt habe ich auch etwas dabei, sicher.
DANKE!


PS Würde mich natürlich interessieren warum das jetzt "nicht schön" ist. Es ist doch so wie es ist logisch, warum also unschön?!?! okay, muss wohl noch viel lernen :-( Danke nochmal und viel Erfolg weiterhin!
 
Last edited by a moderator:
"unschön" ist es, weil zwei Subshells (die find-Aufrufe) geöffnet werden und touch dreimal aufgerufen wird. Auch das if-Statement hätte ich gerne weggelassen, aber dann hätte ich auf Quick'n'Dirty verzichten und ausgibig testen müssen. Zudem fehlt eine Fehlerbehandlung. Meine Faulheit hat hier diesmal gesiegt ;)

Wenn es für Dich akzeptabel läuft, ist es ja duchaus OK, aber ich bin mir sicher, dass es schöner, effizienter und fehlertoleranter gehen kann.
 
ähm, jetzt doch noch ein kleiner Fehler gefunden.
Wenn ein Verzeichnis nun ein Leerzeichen hat, bspw. "April 2012" funktioniert es nicht. Anführungszeichen sind ja eigentlich schon da, müssen noch welche irgendwo hin?

Code:
#!/bin/bash
for DIR in `find /var/www -mindepth 1 -type d -print0 | xargs -0`
do
  I="`find $DIR -mindepth 1 -maxdepth 1 -type d -print0 | xargs -0`"
  if [ ! -z "$I" ]
  then
    touch -r $DIR /tmp/TIMESTAMP
    touch $DIR/beispiel.txt
    touch -r /tmp/TIMESTAMP $DIR
    rm -f /tmp/TIMESTAMP
  fi
done
exit 0
 
Last edited by a moderator:
Code:
for DIR in `find /var/www -mindepth 1 -type d -print0 | xargs -0`

Nicht schlecht. Ich wollte erst fragen ob es da nicht Probleme mit Leerzeichen im Pfad gibt. Parst die For-Schleife also die Argumentenliste und splittet nicht nach Leerzeichen bzw. newline auf? Eigentlich ist es doch nur eine Kommandosubstitution, was die Ausgabe als reinen Text einfügt und dann wird die for-schleife erst ausgeführt.

Bin auf die Antwort gespannt. Hab gerade keine Zeit das selbst zu testen...

Kann nicht mehr klar denken...
 
So, da es mich nun doch gewurmt hat, habe ich selbst wieder etwas dazugelernt und getestet:
Code:
#!/bin/bash
find /var/www -mindepth 1 -type d -print0 | while IFS= read -r -d $'\0' DIR
do
  find "$DIR" -mindepth 1 -maxdepth 1 -type d -print0 | while IFS= read -r -d $'\0' I
  do
    if [ ! -z "$I" ]
    then
      touch -r "$DIR" /tmp/TIMESTAMP
      touch "$DIR/beispiel.txt"
      touch -r /tmp/TIMESTAMP "$DIR"
      rm -f /tmp/TIMESTAMP
    fi
  done
done
exit 0
Quellen: http://tldp.org/LDP/abs/html/abs-guide.html und http://unix.stackexchange.com/questions/9496/
 
Held!
Klappt natürlich, da hab ich ja nun Glücl gehabt das es dich gewurmt hat. 1000 Dank! auch für die Quellen werd ich mal checken morgen ob ich durchsteige!
 
Das if-Statement ist in der neuen Version überflüssig, es reicht also:
Code:
#!/bin/bash
find /var/www -mindepth 1 -type d -print0 | while IFS= read -r -d $'\0' DIR
do
  find "$DIR" -mindepth 1 -maxdepth 1 -type d -print0 | while IFS= read -r -d $'\0' I
  do
    touch -r "$DIR" /tmp/TIMESTAMP
    touch "$DIR/beispiel.txt"
    touch -r /tmp/TIMESTAMP "$DIR"
    rm -f /tmp/TIMESTAMP
  done
done
exit 0
Weitere Optimierungen würde ich gerne den geneigten Mitlesern überlassen und freue mich bereits darauf. Danke im Voraus.
 
Back
Top