Ich habe jetzt mit beiden Möglichkeiten mal ein bisschen herumexperimentiert und bin dadurch vor allem einem Verständnis
dieser ganzen Shell- & Bash-Programmierungen wieder ein Stück näher gekommen. Gespeichert für eventuelle spätere
(Anders-)Weiterverwendungen habe ich sie mir ja auch sozusagen schon durch diesen Beitrag - kann nicht mehr verloren geh'n!
Im Prinzip wäre das Problem also gelöst.
Jetzt hänge ich an anderer Stelle. Aber vielleicht kann man das ja als Ergänzung noch hinten dran hängen:
Ich habe mir folgendes Skript als Vorlage genommen
#!/bin/bash
# loop & print a folder recusively,
print_folder_recurse() {
for i in "$1"/*;do
if [ -d "$i" ];then
echo "dir: $i"
print_folder_recurse "$i"
elif [ -f "$i" ]; then
echo "file: $i"
fi
done
}
# try get path from param
path=""
if [ -d "$1" ]; then
path=$1;
else
path=".*"
fi
echo "base path: $path"
print_folder_recurse $path
Und das erzeugt mir bei meiner Ordner-Struktur
Oberste Ebene:
ordner
Eine Ebene tiefer:
ordner-unterordner1
ordner-unterordner2
ordner-unterordner3
ordner_revisions
Zwei Ebenen tiefer:
unterordner1_revisions
unterordner2_revisions
unterordner3-unterordner1
unterordner3-unterordner2
Drei Ebenen tiefer:
unterordner3-unterordner1_revisions
unterordner3-unterordner2_revisions
(geht teilweise noch deutlich weiter runter!)
eine solche Ausgabe im Terminal (nur ein kleiner Ausschnitt):
dir: ./schubladisierung-philosophie
dir: ./schubladisierung-philosophie/historie-typeneinteilung
file: ./schubladisierung-philosophie/historie-typeneinteilung/history.html
file: ./schubladisierung-philosophie/historie-typeneinteilung/index.html
dir: ./schubladisierung-philosophie/historie-typeneinteilung/_revisions
file: ./schubladisierung-philosophie/historie-typeneinteilung/_revisions/10.html
file: ./schubladisierung-philosophie/historie-typeneinteilung/_revisions/1.html
file: ./schubladisierung-philosophie/historie-typeneinteilung/_revisions/2.html
file: ./schubladisierung-philosophie/historie-typeneinteilung/_revisions/3.html
file: ./schubladisierung-philosophie/historie-typeneinteilung/_revisions/4.html
file: ./schubladisierung-philosophie/historie-typeneinteilung/_revisions/5.html
file: ./schubladisierung-philosophie/historie-typeneinteilung/_revisions/6.html
file: ./schubladisierung-philosophie/historie-typeneinteilung/_revisions/7.html
file: ./schubladisierung-philosophie/historie-typeneinteilung/_revisions/8.html
file: ./schubladisierung-philosophie/historie-typeneinteilung/_revisions/9.html
file: ./schubladisierung-philosophie/history.html
file: ./schubladisierung-philosophie/index.html
dir: ./schubladisierung-philosophie/_revisions
file: ./schubladisierung-philosophie/_revisions/1.html
file: ./schubladisierung-philosophie/_revisions/2.html
file: ./schubladisierung-philosophie/_revisions/3.html
Ich hätte gedacht, ich könnte wenigstens eine der beiden Lösungen mal so eben in so ein Skript einbauen,
aber da bin ich schnell an meine Grenzen gestoßen - soweit reicht mein Verständnis leider doch noch nicht, tja.
Viel fehlt wahrscheinlich nicht mehr, je mehr ich google und in Wiki und im Forum rumstöber', desto mehr gehen mir
die Lichter(chen) auf. Alles nur eine Frage der Zeit.
Aber vielleicht kann mir jemand auf die Sprünge helfen, der sieht, woran es bei mir noch hakt oder hapert.
Grundsätzlich scheine ich da wohl etwas falsch zu verstehen, einfach mit so einer Schleife in ein Verzeichnis wechseln
und dann einen Befehl wie in der Shell ausführen zu können. Außerdem fehlt mir noch ein Überblick über einen sinnvollen
Umgang mit Variablen (was gibt es schon als Systemvariable, was ist selbst zu deklarieren & wie kommt der Inhalt einer
Variablen wieder in einen Dateinamen, der von einem Kommando benutzt wird) ... und und und - bin aber grade dabei, mir
das aufzuarbeiten, z.B.
cd "$OLDPWD" && pwd
wechselt ja in das Verzeichnis, von wo aus man verzweigt ist - vielleicht
könnte ich das in so einem Skript brauchen?) usw. ...
Ich kopiere gleich noch ein anderes Skript hier hinein, von meinen diversen Versuchen, was ich auf einem anderen Rechner habe...
So, hier habe ich das eine.
Mir ist selber schon klar, daß da irgendein ganz dummer Anfängerfehler oder Denkfehler drin steckt - nur sehe ich im
Moment den Wald vor lauter Bäumen nicht 😉
#!/bin/bash
# loop & print a folder recusively,
print_folder_recurse() {
for i in "$1"/*;do
# Hier ist jetzt Ansatz 2 verbaut
for f in *.html; do
num=$(echo "$f" | egrep -o '[[:digit:]]+')
if [ $num -eq $max ]; then
echo mv -v "$f" /tmp/
else
echo rm -v "$f"
fi
done
# Abschnitt "Ansatz 2" zu Ende
if [ -d "$i" ];then
echo "dir: $i"
print_folder_recurse "$i"
elif [ -f "$i" ]; then
echo "file: $i";
fi
done
}
# try get path from param
path=""
if [ -d "$1" ]; then
path=$1;
else
path=".*"
fi
echo "base path: $path"
print_folder_recurse $path
Und das hier dürfte "den Vogel abschießen", lol:
#!/bin/sh
# file-name: lastrevisionsubfolder.sh
# Schleife über alle Unterverzeichnisse
rename 's/-(.*)/\1/' *
for i in *
do
# Das folgende wird nur ausgeführt,
# wenn $i ein Directory bezeichnet:
if [ -d $i ]
then
# verzweigt in das aktuelle Unterverzeichnis:
cd $i
# Damit man sieht, aus welchem Verzeichnis
# das später zu druckende
# Ergebnis kommt
echo -n "$i: "
# alle Revisionen von *.html-Dateien löschen, bis auf die letzte Revision
# Der amateurhafte Einsatz von Ansatz 1 ;-)
echo *.html | egrep -o '[[:digit:]]+' | sort -nr | sed -ne '2,$ {s#$#.html#;p}' | xargs -r -d \\n rm -v
# Abschnitt mit Ansatz 1 Ende
for j in *
do
# Das folgende wird nur ausgeführt,
# wenn $i ein Directory bezeichnet:
if [ -d $j ]
then
# verzweigt in das aktuelle Unterverzeichnis:
cd $j
# Damit man sieht, aus welchem Verzeichnis
# das später zu druckende
# Ergebnis kommt
echo -n "$j: "
# alle Revisionen von *.html-Dateien löschen, bis auf die letzte Revision
# Ansatz 1
echo *.html | egrep -o '[[:digit:]]+' | sort -nr | sed -ne '2,$ {s#$#.html#;p}' | xargs -r -d \\n rm -v
# Ansatz 1 Ende
for k in *
do
# Das folgende wird nur ausgeführt,
# wenn $i ein Directory bezeichnet:
if [ -d $k ]
then
# verzweigt in das aktuelle Unterverzeichnis:
cd $k
# Damit man sieht, aus welchem Verzeichnis
# das später zu druckende
# Ergebnis kommt
echo -n "$k: "
# alle Revisionen von *.html-Dateien löschen, bis auf die letzte Revision
# Ansatz 1
echo *.html | egrep -o '[[:digit:]]+' | sort -nr | sed -ne '2,$ {s#$#.html#;p}' | xargs -r -d \\n rm -v
# Ansatz 1 Ende
# zurück zum Eltern-Verzeichnis:
cd ..;
# ein "i", also eine Datei ode einen Ordner, weiter:
fi
done
# zurück zum Eltern-Verzeichnis:
cd ..;
# ein "i", also eine Datei ode einen Ordner, weiter:
fi
done
# zurück zum Eltern-Verzeichnis:
cd ..;
# ein "i", also eine Datei oder einen Ordner, weiter:
fi
# solange "i in *", also solange etwas (Nächstes) gefunden wird, schleift sich die Schleife, wenn nix mehr da ist, wofür die Wildcard "*" einstehen darf, ist der Käs' 'gesse...:
done
Zu meiner Verteidigung muss ich sagen, daß ich schon weiß, das so etwas mit Rekursion gelöst werden muss statt mit
so einer umständlichen Verschachtelung - ganz klar, wäre Quatsch.
Ich wollt's einfach nur mal ausprobieren, weil ich mit den Schleifen noch nicht so vertraut bin
(damit habe ich vor 3, 4 Jahren zuletzt in einem Turbo-Pascal-Kura mal näher mit zu tun gehabt, aber hier in den Bash-Skripten ist das anscheinend etwas anders...).
Naja, aber selbst das hat ja noch nicht funktioniert... egal, ich wurschtel noch ein bisschen weiter!
Vielleicht hat aber jemand in der Zwischenzeit noch 'ne gute Idee, wie ich weiterkommen könnte.
@rklm
Bei deinem zweiten Ansatz:
for f in *.html; do
num=$(echo "$f" | egrep -o '[[:digit:]]+')
if [ $num -eq $max ]; then
echo mv -v "$f" '''woanders'''
else
echo rm -v "$f"
fi
done
Wie kann ich das "woanders" einfach durch "eine Ebene höher" ersetzen?
Ich glaube, das "$OLDPWD" läßt sich an dieser Stelle nicht verwenden, oder?
(Ich probier's gleich aber einfach selbst aus - vor allem würde mich dann interessieren, warum nicht (wenn nicht).)
Soweit nochmals vielen Dank
&
Gruß
Thorsten
Ein bisschen weiter bin ich seit gestern gekommen, indem ich das folgende "entdeckt" habe:
find . ... | grep -
Geht rekursiv durch alle Ordner und Unterordner & gibt mir alle Dateien und Ordner, die einen Bindestrich enthalten aus.
Das gehört z.T. mit zu meinem übergeordneten Problem, weil - je nach Art der Ausführung - die Ordner, die mit einem
"-" im Namen beginnen (nicht mein Werk, sondern das von Googles automatischer Seitenbenennung) stören und Kommandos
abbrechen lassen.
Wenn ich dann
find . ... | grep -
probiere, bekomme ich eine Ausgabe über alle Ordner und Dateien, die den
Bindestrich enthalten,
find . ... | grep '^-'
oder
find . ... | egrep '^-.*'
funzt wieder nicht - da heißt es: find: "...": Datei oder Verzeichnis nicht gefunden.
Auch das an manchen Stellen angegebene '\<', auch mal mit Option -a probiert, bringt mir nix außer die Fehlermeldung.
find . ... -name "-*"
findet mir das Gewünschte, bricht dann aber ab:
find: "...": Datei oder Verzeichnis nicht gefunden
,
dito
find . type d -name "-*"
mit
find: "type": Datei oder Verzeichnis nicht gefunden
find: "d": Datei oder Verzeichnis nicht gefunden
,
während
find . -name "-*"
natürlich alles ohne Fehlermeldung findet, nur eben beschränkt auf eine Unterebene.
.......................................................................................................................
Was so "eine Nacht mal drüber schlafen" doch bringt: Heute komme ich viel schneller vorwärts!
Ich habe grade mal das probiert:
for i in `find . -type d -name "-*"` ; do mv $i `echo $i | sed 's/^-//'` ; done
und das bringt mir schon fast die Lösung (beschränkt eben auf die 'nur eine Unterebene'):
mv: das Verschieben von »./-gesetz-der-natuerlichen-ausgewogenheit-omx“ in ein Unterverzeichnis seiner selbst (»./-gesetz-der-natuerlichen-ausgewogenheit-omx/-gesetz-der-natuerlichen-ausgewogenheit-omx“) ist nicht möglich
mv: das Verschieben von »./-formel-g-omx“ in ein Unterverzeichnis seiner selbst (»./-formel-g-omx/-formel-g-omx“) ist nicht möglich
mv: das Verschieben von »./-sprachlos-omx“ in ein Unterverzeichnis seiner selbst (»./-sprachlos-omx/-sprachlos-omx“) ist nicht möglich
Trotzdem ist das Feeling bei mir immer noch ein bisschen das wie das "Stochern im Nebel", wenn auch zunehmend sicherer 😉
Ich glaube, langsam sprengt es wirklich den Rahmen...
Ich gebe noch kurz das hier 'rein & dann halte ich auch erstmal Ruhe:
Unknown option: the-deserts-omz/_revisions/3.html
Unknown option: t
Unknown option: h
Unknown option: r
Unknown option: o
Unknown option: u
Unknown option: g
Unknown option: h
Unknown option: the-deserts-omz/_revisions/4.html
Unknown option: t
Unknown option: h
Unknown option: r
Unknown option: o
Unknown option: u
Unknown option: g
Unknown option: h
Unknown option: the-deserts-omz/_revisions/5.html
Unknown option: t
Unknown option: h
Unknown option: r
Unknown option: o
Unknown option: u
Unknown option: g
Unknown option: h
Unknown option: the-deserts-omz/_revisions/6.html
Unknown option: t
Unknown option: h
Unknown option: r
Unknown option: o
Unknown option: u
Unknown option: g
Unknown option: h
Unknown option: the-deserts-omz/_revisions/7.html
Unknown option:
erhalte ich als (Ausschnitt) Meldung, wenn ich es hiermit
rename -n 's/^-(.*)/\1/' **/*
versuche.
Davor habe ich mit
shopt -s globstar
die Globstar-Option eingeschaltet (sagt man so?).
Die gleiche (oder sehr ähnliche Meldung erhalte ich mit dem Skript
#!/bin/bash
# loop & print & rename a folder & its subfolder
for i in "$1"./*;do
if [ -d "$i" ];then
echo "dir: $i"
rename -n 's/(^-(.*))/\2/' *
elif [ -f "$i" ]; then
echo "file: $i";
fi
done
.
So, das war's jetzt wirklich erstmal.
Vielen Dank schon mal vorab, wenn jemand irgend eine gute Idee, die mir den nächsten Verständnisschritt ermöglicht,
hat und sie hier postet!
[Ich habe es hier nur mal als Zusatzinfo auch noch mit hinten dran gehängt - vielleicht sollte ich aber besser neue
Threads für die Teilprobleme aufmachen, wenn ich nicht selber was finde - wie es euch lieber ist, vielen Dank!]