tresix
Anmeldungsdatum: 23. Oktober 2009
Beiträge: 69
|
Hallo zusammen, ich benötige ein Script, dass mir automatisch Symlinks mit dem Namen latest auf die aktuellste Version eines Ordners setzt und alte überschreibt (ln -sf). Zum einfacheren Verständnis hier meine Ordnerstruktur (die Punkte sollen einfach nur visualisieren, dass es hier noch reichlich Unterverzeichnisse und Dateien geben kann): | /var/www/libs
/var/www/libs/bootstrap/3.0.1/.../...
/var/www/libs/bootstrap/3.2.0/.../...
/var/www/libs/jquery/1.7.9/.../...
/var/www/libs/jquery/2.1.1/.../...
...
|
Nun möchte ich zum Beispiel einen Symlink /var/www/libs/bootstrap/latest auf das Verzeichnis /var/www/libs/bootstrap/3.2.0 automatisiert setzen (also das mit der höchsten Versionsnummer). Mit folgendem (ähnlichem) Code habe ich zumindest schon mal alle relevanten Unterverzeichnisse bekommen. Leider funktioniert das durch ewiges herumprobieren nun leider auch nicht mehr richtig. | for dir in $(find /var/www/libs -maxdepth 2 -mindepth 2 -type d -print \;); do
...
done
|
Könnt ihr mir weiterhelfen? Viele Dank im Voraus! LG tresix
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
Nett ist es dann ein Skrpt mit Testdaten zu generieren das die Stolperstellen schon erhält. Ich habe hier eine Struktur mit einem Unterverzeichenis zuviel erzeugt.
| mkdir libs
cd libs
touch a b c
mkdir d e f
mkdir d/x e/y f/z
mkdir d/x/1.0 e/y/0.9.1 f/z/3.1.0
mkdir d/x/1.0.4 e/y/0.9.2 f/z/3.2.0
mkdir d/x/1.1.0 e/y/0.11.2 f/z/3.3.1
|
Darstellung:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 | find
.
./a
./adhoc.sh
./d
./d/x
./d/x/1.0.4
./d/x/1.1.0
./d/x/1.0
./b
./c
./f
./f/z
./f/z/3.1.0
./f/z/3.2.0
./f/z/3.3.1
./e
./e/y
./e/y/0.11.2
./e/y/0.9.2
./e/y/0.9.1
|
sort hat einen Schalter -V für das Sortieren nach Versionsnummern - wäre also praktisch darauf zuzusteuern.
| find . -maxdepth 2 -mindepth 2 -type d -exec ./adhoc.sh {} ";"
./d/x 1.1.0
./f/z 3.3.1
./e/y 0.11.2
|
Die Magie von adhoc.sh: | #!/bin/bash
#
# (C) 2014 Gnu GPLv3.0, Ty Coon, Vicepresident Yoyodyne Inc.
#
echo -ne $1"\t"
ls $1 | sort -V | tail -n 1
|
Wenn alle Verzeichnisse gleich tief angesiedelt sind ohne dass da auch störende, ordinäre Dateien sind geht es auch ohne find und adhoc-Skript gut:
| for d in */*; do echo -ne $d"\t"; ls $d/* | sort -V | tail -n 1; done
|
|
tresix
(Themenstarter)
Anmeldungsdatum: 23. Oktober 2009
Beiträge: 69
|
Wow, damit hätte ich nicht so schnell gerechnet ☺ Ich bin immer wieder erstaunt, was in der Bash mit ein paar Befehlen alles möglich ist. Leider passt es noch nicht so ganz. Vielleicht bin ich aber auch nur zu blöd. Wenn ich das jetzt laufen lasse, bekomme ich Ausgaben wie: | ...
jquery/2.1.1 jquery/2.1.1/jquery-2.1.1.min.js
jquery/latest jquery/latest/jquery-2.1.1.min.js
...
|
1. Wie komme ich nur an den ersten Teil des Eintrags, also zum Beispiel jquery/2.1.1? 2. Die 'latest' Einträge sollen ja nicht ausgegeben werden, sondern überschrieben, also dürfen sie nicht mit ausgegeben werden. Eventuell mit grep -v latest? LG tresix
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
tresix schrieb: Wow, damit hätte ich nicht so schnell gerechnet ☺ Ich bin immer wieder erstaunt, was in der Bash mit ein paar Befehlen alles möglich ist.
Sort, ls und tail sind externe Programme. Nur echo gibt es als buildin.
Leider passt es noch nicht so ganz. Vielleicht bin ich aber auch nur zu blöd. Wenn ich das jetzt laufen lasse, bekomme ich Ausgaben wie: | ...
jquery/2.1.1 jquery/2.1.1/jquery-2.1.1.min.js
jquery/latest jquery/latest/jquery-2.1.1.min.js
...
|
Wie gesagt - meine Testdaten habe ich mit einem Unterverzeichnis zu viel erzeugt. Bei find min/maxdepth eins kleiner wählen, vielleicht?
1. Wie komme ich nur an den ersten Teil des Eintrags, also zum Beispiel jquery/2.1.1?
Ich frage mich wie Du auf den zweiten kommst (mit js).
2. Die 'latest' Einträge sollen ja nicht ausgegeben werden, sondern überschrieben, also dürfen sie nicht mit ausgegeben werden. Eventuell mit grep -v latest?
Wenn sie neu erzeugt werden einfach vorher löschen.
|
tresix
(Themenstarter)
Anmeldungsdatum: 23. Oktober 2009
Beiträge: 69
|
Du hattest doch geschrieben, da die Verzeichnistiefe immer gleich ist, kann man auch ohne find und adhoc.sh arbeiten. Das habe ich gemacht und einfach nur die letzte For-Schleife genommen, die du gepostet hast. Die JS-Dateien kommen genau dabei als Ausgabe.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
Dann ist in Deiner Struktur die Verzeichnistiefe aber immer noch um eins tiefer als bei mir, oder?
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
Verschiebe ich die Verzeichnisse eins nach oben, dann sieht es so aus:
| for d in *; do echo -ne $d"\t"; ls $d/* | sort -V | tail -n 1; done
x x/1.1.0:
y y/0.11.2:
z z/3.3.1:
|
|
tresix
(Themenstarter)
Anmeldungsdatum: 23. Oktober 2009
Beiträge: 69
|
Also ich befinde mich in /var/www/libs. Wenn ich hier deine For-Schleife eingebe
| for d in */*; do echo -ne $d"\t"; ls $d/* | sort -V | tail -n 1; done
|
bekomme ich diese Ausgabe: | ....
bootstrap/3.1.1 ie-emulation-modes-warning.js
bootstrap/3.2.0 ie-emulation-modes-warning.js
...
jquery/1.7.9 jquery-1.7.9.min.js
jquery/2.1.1 jquery-2.1.1.min.js
...
|
Wobei die Dateien nach dem Leerzeichen natürlich in dem jeweiligen Verzeichnis existieren.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
Wie gezeigt ist dann ein * zuviel - nicht */* sondern *.
|
tresix
(Themenstarter)
Anmeldungsdatum: 23. Oktober 2009
Beiträge: 69
|
Sorry, dass ich mich jetzt erst melde. Leider bringt das noch weniger benötigte Daten. Jetzt fehlen die Versionsnummern der Verzeichnisse komplett. Lasse ich den schliessenden Slash noch weg (* statt */), bekomme ich die gleiche Ausgabe, nur der Slash am vorderen Verzeichnisnamen fehlt am Ende. | ...
bootstrap/ ie-emulation-modes-warning.js
bootstrap/ ie-emulation-modes-warning.js
...
jquery/ jquery-1.7.9.min.js
jquery/ jquery-2.1.1.min.js
...
|
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
So sieht meine Testumgebung
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | > ls
x y z
> find
.
./y
./y/0.11.2
./y/0.9.2
./y/0.9.1
./z
./z/3.1.0
./z/3.2.0
./z/3.3.1
./x
./x/1.0.4
./x/1.1.0
./x/1.0
|
und das Kommando samt Ergebnis aus: | > for d in *; do echo -ne $d"\t"; ls $d/* | sort -V | tail -n 1; done
x x/1.1.0:
y y/0.11.2:
z z/3.3.1:
|
|
tresix
(Themenstarter)
Anmeldungsdatum: 23. Oktober 2009
Beiträge: 69
|
Ich habe gerade nochmals genauer nachgesehen. Das einzige was mir auffällt ist: Kann es daran liegen, dass du keine Unterordner und Dateien mehr in deinen Testordnern hast.
Mit deiner Struktur passt es bei mir so weit ich das sehe auch. Mit Inhalten bekomme ich allerdings ganz andere Daten angezeigt.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
Ja. Ich lösche mal x/... , denn 2 Verzeichnisse sollten genügen, und füge Dummyfiles ein:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 |
find
.
./y
./y/0.11.2
./y/0.11.2/file.js
./y/0.9.2
./y/0.9.2/file.js
./y/0.9.1
./y/0.9.1/file.js
./z
./z/3.1.0
./z/3.1.0/file.js
./z/3.2.0
./z/3.2.0/file.js
./z/3.3.1
./z/3.3.1/file.js
|
Dann geht es mit
| for d in */; do echo -ne $d"\t"; ls $d* | sort -V | tail -n 1 ; done
y/ y/0.11.2:
z/ z/3.3.1:
|
|
tresix
(Themenstarter)
Anmeldungsdatum: 23. Oktober 2009
Beiträge: 69
|
Hallo, vielen Dank für deine Hilfe. Die Find-Ausgabe sieht bei mir genauso aus wie bei dir, also sollte das soweit schon mal passen. Bei der Ausführung deiner FOR-Schleife hingegen wird immer der letzte Eintrag aus einem Unterordner angezeigt (alphabetisch sortiert). Beispiel mit den vorhandenen Dateien: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 | /bootstrap/3.1.1/config.xml
/bootstrap/3.1.1/css
/bootstrap/3.1.1/css/bootstrap.css
/bootstrap/3.1.1/css/bootstrap.min.css
/bootstrap/3.1.1/css/bootstrap-theme.css
/bootstrap/3.1.1/css/bootstrap-theme.min.css
/bootstrap/3.1.1/fonts
/bootstrap/3.1.1/fonts/glyphicons-halflings-regular.eot
/bootstrap/3.1.1/fonts/glyphicons-halflings-regular.svg
/bootstrap/3.1.1/fonts/glyphicons-halflings-regular.ttf
/bootstrap/3.1.1/fonts/glyphicons-halflings-regular.woff
/bootstrap/3.1.1/js
/bootstrap/3.1.1/js/bootstrap.js
/bootstrap/3.1.1/js/bootstrap.min.js
/bootstrap/3.1.1/js/ie10-viewport-bug-workaround.js
/bootstrap/3.1.1/js/ie8-repsonsive-file-warning.js
/bootstrap/3.1.1/js/ie-emulation-modes-warning.js
/bootstrap/3.2.0/config.xml
/bootstrap/3.2.0/css
/bootstrap/3.2.0/css/bootstrap.css
/bootstrap/3.2.0/css/bootstrap.min.css
/bootstrap/3.2.0/css/bootstrap-theme.css
/bootstrap/3.2.0/css/bootstrap-theme.min.css
/bootstrap/3.2.0/fonts
/bootstrap/3.2.0/fonts/glyphicons-halflings-regular.eot
/bootstrap/3.2.0/fonts/glyphicons-halflings-regular.svg
/bootstrap/3.2.0/fonts/glyphicons-halflings-regular.ttf
/bootstrap/3.2.0/fonts/glyphicons-halflings-regular.woff
/bootstrap/3.2.0/js
/bootstrap/3.2.0/js/bootstrap.js
/bootstrap/3.2.0/js/bootstrap.min.js
/bootstrap/3.2.0/js/ie10-viewport-bug-workaround.js
/bootstrap/3.2.0/js/ie8-repsonsive-file-warning.js
/bootstrap/3.2.0/js/ie-emulation-modes-warning.js
|
Ergebnis deiner FOR-Schleife: Richtigerweise müsste das Ergebnis aber ein Verzeichnis höher ausgeben, also
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
tresix schrieb:
Die Find-Ausgabe sieht bei mir genauso aus wie bei dir, also sollte das soweit schon mal passen. Bei der Ausführung deiner FOR-Schleife hingegen wird immer der letzte Eintrag aus einem Unterordner angezeigt (alphabetisch sortiert).
Ergebnis deiner FOR-Schleife: Richtigerweise müsste das Ergebnis aber ein Verzeichnis höher ausgeben, also
Du solltest auch das Kommando per copy-and-paste übertragen, welches das falsche Ergebnis produziert. Ich habe zusätzlich Unterordner und dummyfiles erzeugt, aber das Ergebnis stimmt bei mir immer noch:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | find
.
./file.js
./y
./y/0.11.2
./y/0.11.2/file.js
./y/0.11.2/css
./y/0.11.2/css/foo.css
./y/0.9.2
./y/0.9.2/file.js
./y/0.9.2/css
./y/0.9.2/css/foo.css
./y/0.9.1
./y/0.9.1/file.js
./y/0.9.1/css
./y/0.9.1/css/foo.css
|
Verzeichnisse css und Dateien foo.css erzeugt, analog für z.
| for d in */; do echo -ne $d"\t"; ls $d* | sort -V | tail -n 1 ; done
y/ y/0.11.2:
z/ z/3.3.1:
|
|