Tronde
Anmeldungsdatum: 23. November 2006
Beiträge: 1640
|
Hallo rklm, danke für deinen Hinweis. Ich habe beide Skripte dahingehend angepasst, dass nun for-Schleifen anstelle von ls verwendet werden. Die aktuellen Versionen befinden sich bereits auf GitHub. Eine Frage habe ich aber noch.
rklm schrieb: mogrify -resize "${aufloesung}x$aufloesung" "$file"
Dieser Aufruf sieht für mich noch nicht ganz optimal aus. Ich habe ihn statt dessen wie folgt gestaltet:
| mogrify -resize "${aufloesung}"x"${aufloesung}" "$file"
|
Kannst du mir erklären, warum du in deinem Beispiel auf die zweite Klammerung verzichtet hast? MfG Tronde
|
rklm
Projektleitung
(Themenstarter)
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12527
|
Tronde schrieb:
Eine Frage habe ich aber noch.
rklm schrieb: mogrify -resize "${aufloesung}x$aufloesung" "$file"
Dieser Aufruf sieht für mich noch nicht ganz optimal aus.
Was bedeutet "nicht ganz optimal" bzw. optimal in Bezug auf was?
Ich habe ihn statt dessen wie folgt gestaltet:
| mogrify -resize "${aufloesung}"x"${aufloesung}" "$file"
|
Kannst du mir erklären, warum du in deinem Beispiel auf die zweite Klammerung verzichtet hast?
Sie war einfach nicht nötig. Die erste Klammer ist nötig, damit die Shell nicht das "x" für einen Teil des Variablennamens hält. Ich gebe aber zu, dass das seltsam aussieht. Wenn Du beides klammern willst, würde ich aber trotzdem nur ein Paar von Anführungsstrichen verwenden: | mogrify -resize "${aufloesung}x${aufloesung}" "$file"
|
Im Endeffekt kommt es auf das Gleiche raus, denn die Shell übergibt das Konstrukt als eine Zeichenkette. Das wird mit einem Paar Anführungsstriche vielleicht etwas deutlicher. Ggf. macht es der Shell auch weniger Arbeit.
|
Tronde
Anmeldungsdatum: 23. November 2006
Beiträge: 1640
|
Danke für die Erklärung. ☺ Viele Grüße Tronde
|
jms3000
Anmeldungsdatum: 29. Januar 2015
Beiträge: 742
|
Wenn man "ls r*" macht, dann zeigt ls nicht nur alle Dateien an, die mit "r" anfangen, sondern auch alle Directories *und* deren Inhalt.
Da mich das nervt, habe ich ein bisschen rumgeforscht.
Also das funktioniert so:
Wenn man "echo ls r*" eingibt, dann bekommt man: "ls reisen.txt rad.jpg rSync". (rSync ist ein Directory)
Das kommt daher, dass der "*" nämlich nicht vom "ls" aufgelöst wird, sondern von der Shell.
Ruft man also "ls *" auf, dann bekommt ls nicht den Stern übergeben, sondern "reisen.txt rad.jpg rSync".
Das ist also genau so wie wenn man "ls reisen.txt rad.jpg rSync" aufruft.
Und die 3 Argumente zeigt ls jetzt an. Und da "rSync" ein Directory ist, zeigt "ls rSync" natürlich den Inhalt an. Jetzt gibt es die Option "-d". Die bewirkt folgendes: wenn ls festellt, dass das übergebene Element ein Directory ist, dann zeigt er nicht den Inhalt an, sondern nur den Eintrag. Also eigentlich ist "ls -lartd" das, was man von Windows kennt. Wäre da nicht eine weitere Tücke: Ruft man nur "ls" auf ohne Argumente, dann nimmt ls den Punkt "." als Argument. Also "ls" ist das gleiche wie "ls .", und "." steht für das aktuelle Verzeichnis. Und das zeigt ls jetzt an. Ruft man aber "ls -d" auf, ist das wieder das gleiche wie "ls -d .". Jetzt nimmt ls den ".", stellt fest, dass das ein Directory ist und wegen des "-d" zeigt er den Inhalt aber nicht an. Wenn man also "ls -d" macht, sieht man nichts ausser dem "." Um trotzdem ein Verhalten zu bekommen, wie es unter anderen Betriebssystemen normal ist, habe ich mir folgende Funktion gebastelt:
| function dir {
if [ -n "$1" ]
then
ls -lartd "$@"
else
ls -lartd *
fi
}
|
Das kann man entweder direkt in die Befehlszeile einfügen oder in die Datei .bashrc einfügen. Damit hat man dann einen "dir" Befehl, der nicht in Directories reingeht. Die Funktion geht so: gibt man nur "dir" ein, macht sie daraus "ls -lartd *". Gibt man "dir argum1" ein, macht sie daraus "ls -lartd argum1". Moderiert von rklm: Thema an den passende Permathread angehängt
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17432
|
Das r*-Problem könntest Du auch so lösen:
| find -maxdepth 1 -type f -name "r*"
|
aber wenn Du das häufiger brauchst, ist eine Funktion sicher bequemer.
|
rklm
Projektleitung
(Themenstarter)
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12527
|
jms3000 schrieb:
| function dir {
if [ -n "$1" ]
then
ls -lartd "$@"
else
ls -lartd *
fi
}
|
Ich würde auf die Anzahl der Argumente testen: | function dir {
if [ $# -gt 0 ]
then
ls -lartd "$@"
else
( set +f; ls -lartd * )
fi
}
|
Ggf. kann man auch eine Subshell wie in Zeile 6 verwenden, um das Globbing sicher einzuschalten. Ist aber bei interaktiven Shells normalerweise nicht nötig. Man kann aber Überraschungen erleben, wenn man die Funktion exportiert und dann in einem Skript verwendet, das set -f nutzt. 😬
|
seit1996
Anmeldungsdatum: 18. November 2010
Beiträge: 65
|
|
pettruss
Anmeldungsdatum: 26. Juni 2010
Beiträge: 207
|
Viele Dateien von einem Server simultan auf mehrere Festplatten kopieren Mehr eine Notiz als eine Frage: Ich habe nach einer Möglichkeit gesucht, Dateien aus einem Verzeichnis auf einem Server im LAN auf zwei Festplatten meines Rechners zu kopieren, und zwar so, daß sie nur einmal vom Server gelesen und parallel auf beide Platten geschrieben werden. Das ist das Ergebnis: find -type f -iname \* -exec sh -c '
for file; do
target1="/media/user/drive1/tee/${file##*/}"
target2="/media/user/drive2/tee/${file##*/}"
pv "$file" | tee "$target1" > "$target2"
done
' -- {} + Das ist nicht ganz so schnell wie das simple Kopieren vom Server auf eine Festplatte, aber deutlich schneller als die Dateien vom Server erst auf eine der beiden Platten und dann von dieser auf die zweite Platte zu kopieren. Vielleicht hat jemand Verbesserungsvorschläge (rsync z.B.?). Am Ende könnte man das als Beispiel irgendwo im Wiki einbauen (falls dafür überhaupt Interesse besteht). Ich wüßte jetzt nur nicht in welchem Artikel das am besten aufgehoben wäre (bash? tee? find?). Quellen: https://forum.ubuntuusers.de/topic/exiftool-und-resize-von-hdd-nach-sd-karte-in-e/#post-7587788 https://superuser.com/questions/32630/parallel-file-copy-from-single-source-to-multiple-targets/32634#32634
Moderiert von rklm: Keine Supportanfrage, an das passende Thema angehängt
|
UlfZibis
Anmeldungsdatum: 13. Juli 2011
Beiträge: 2726
|
In Thunderbird Ordner mit neuen E-Mails besser erkennen. In der Windows-Version von TB werden solche Ordner außer mit einem Stern noch zusätzlich durch blaue Schrift kenntlich gemacht, auf Ubuntu ist das leider nicht so, zumindest unter Unity. Das kann man leicht durch ein paar Zeilen in [TB-Profil]/chrome/userChrome.css auch auf Ubuntu erreichen: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 | /* --- Folder name coloured when selected --- */
treechildren::-moz-tree-cell-text(folderNameCol, selected) {
color: orange !important;
/*background: orange !important;*/
}
/* --- Folder name coloured when focused --- */
treechildren::-moz-tree-cell-text(folderNameCol, selected, focus) {
color: white !important;
}
/* --- Folder name coloured upon new messages --- */
treechildren::-moz-tree-cell-text(folderNameCol, newMessages-true) {
color: blue !important;
}
/* --- Super folder name coloured upon unread messages --- */
/*treechildren::-moz-tree-cell-text(folderNameCol, closed, subfoldersHaveUnreadMessages-true) {
background: red !important;
}*/
/* --- Mail account name coloured upon new messages --- */
treechildren::-moz-tree-cell-text(folderNameCol, biffState-NewMail, isServer-true),
treechildren::-moz-tree-cell-text(folderNameCol, specialFolder-Inbox, newMessages-true) {
font-weight: bold !important;
color: blue !important;
}
|
Die beiden ersten Hacks bewirken, dass der Ordner, den man gerade geöffnet hat, im evtl. langen Verzeichnisbaum besser finden kann.
|
tuxifreund
Projektleitung
Anmeldungsdatum: 7. November 2020
Beiträge: 1151
|
Stündlich eine Status-E-Mail erhalten Ein kleines - recht simples - Skript (ich setze es selber unter Ubuntu 20.04 ein), das mir z.B. stündlich (per Cron) eine E-Mail sendet. Es kann natürlich für den eigenen Server angepasst werden. Es setzt einen MTA sowie mailutils und lm-sensors voraus. So wie es jetzt ist, überprüft es den Status von Apache und Postfix. Ich selber hoste das Skript auf Github und habe es unter die AGPL V.3 gestellt. Hier noch mal das Skript: 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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 | #!/bin/bash
if [ $(id -u) -ne 0 ]; then
echo "Skript muss als Root gestartet werden"
exit 1
fi
#Grundkonfiguration
TEMP="PFAD/ZUR/TEMPORÄREN/DATEI"
MAIL="E-MAIL-ADRESSE"
SUBJECT="Serverstatus"
#Mailtext
date > $TEMP
hostname >> $TEMP
uname -a >> $TEMP
echo "" >> $TEMP
echo "Sensoren:" >> $TEMP
echo "" >> $TEMP
sensors >> $TEMP
echo "-----" >> $TEMP
echo "" >> $TEMP
echo "Festplattenspeicher" >> $TEMP
df -h >> $TEMP
echo "-----" >> $TEMP
echo "" >> $TEMP
echo "Uptime" >> $TEMP
uptime >> $TEMP
echo "-----" >> $TEMP
echo "" >> $TEMP
echo "Status Webserver" >> $TEMP
systemctl status apache2 >> $TEMP
echo "-----" >> $TEMP
echo "Status Mailserver" >> $TEMP
systemctl status postfix >> $TEMP
echo "" >> $TEMP
echo "IP-Addresse" >> $TEMP
ip addr >> $TEMP
echo "-----" >> $TEMP
echo "" >> $TEMP
echo "Netzwerkerreichberkeit" >> $TEMP
ping -c 2 startpage.com >> $TEMP
echo "-----" >> $TEMP
echo "" >> $TEMP
#Mail versenden
mail -s $SUBJECT $MAIL < $TEMP
#Temporaere Datei löschen
rm $TEMP
|
Die Zeilen 9 und 10 sind anzupassen. Ich habe das Skript dann abgespeichert und folgende Zeile in der /etc/crontab ergänzt: @hourly root cd /PFAD/ZUM/SKRIPT && bash statusmail
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17432
|
tuxifreund schrieb: | #!/bin/bash
if [ $(id -u) -ne 0 ]; then
echo "Skript muss als Root gestartet werden"
exit 1
fi
|
Wieso muss es als Root gestartet werden?
| #Grundkonfiguration
TEMP="PFAD/ZUR/TEMPORÄREN/DATEI"
|
man tempfile ist Dein Freund ☺
| MAIL="E-MAIL-ADRESSE"
SUBJECT="Serverstatus"
|
Variablen, die nur einmal verwendet werden, sind i.d.R. überflüssig. Sie können sinnvoll sein, um im Scriptkopf alles zu sammeln, was ein anderer User anpassen sollte - dann sollte es aber am Anfang stehen mit einem entsprechenden Kommentar.
| #Mailtext
date > $TEMP
hostname >> $TEMP
uname -a >> $TEMP
|
Solche Wiederholungen spart man sich mit einer Funktion: | report () {
date
hostname
uname -a
# ...
}
report > $TEMP
|
Eine neue Zeile mit echo ausgeben ...
... geht einfacher so:
Solche echo-Kaskaden ...
| echo "" >> $TEMP
echo "Sensoren:" >> $TEMP
echo "" >> $TEMP
sensors >> $TEMP
|
... kann man eindampfen zu | echo "
Sensoren:
" >> $TEMP
sensors >> $TEMP
|
oder | echo "
Sensoren:
$(sensors)
-----
# ...
"
|
Aus ästhetischen Gründen kann man viele echos untereinander gegenüber Variante 1 bevorzugen und Variante 2 kann unnötig komplex werden, wenn man Anführungsstriche bei den Kommandos braucht.
| #Mail versenden
mail -s $SUBJECT $MAIL < $TEMP
#Temporaere Datei löschen
rm $TEMP
|
Nachdem wir eine Reportfunktion haben, kann man die temporäre Datei gleich wegsparen: | report | mail -s $SUBJECT $MAIL
|
Die Zeilen 9 und 10 sind anzupassen.
Wie gesagt: Im Skript dokumentieren.
Ich habe das Skript dann abgespeichert und folgende Zeile in der /etc/crontab ergänzt: @hourly root cd /PFAD/ZUM/SKRIPT && bash statusmail
Das eventuell auch.
|
rklm
Projektleitung
(Themenstarter)
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12527
|
user_unknown schrieb: tuxifreund schrieb:
Solche echo-Kaskaden ...
| echo "" >> $TEMP
echo "Sensoren:" >> $TEMP
echo "" >> $TEMP
sensors >> $TEMP
|
[...]
Aus ästhetischen Gründen kann man viele echos untereinander gegenüber Variante 1 bevorzugen und Variante 2 kann unnötig komplex werden, wenn man Anführungsstriche bei den Kommandos braucht.
Deshalb bietet sich Variante 3 an: | cat <<SENSOREN >> "$TEMP"
Sensoren:
$(sensors)
SENSOREN
|
Ich würde die Temp-Datei auch nicht so oft öffnen, weil das Das Skript umständlich macht, Zeit kostet und die Möglichkeit einschließt, dass die Ausgabe nicht komplett in einer Datei landet. Beides ist in der Praxis meistens nicht relevant, wirst Du vermutlich anmerken, aber jeder hat halt so seine Präferenzen. Auf jeden Fall bietet es sich an, den Namen der temporären Datei generieren zu lassen und durch einen Trap sicherzustellen, dass die Datei am Ende auf jeden Fall gelöscht wird: 1
2
3
4
5
6
7
8
9
10
11
12 | temp=$(mktemp)
trap 'rm -f "$temp"' 0
# Umleitung, um die Datei offen zu halten
exec 4>"$temp"
echo 'In die Tempdatei' >&4
echo 'Nach Stdout'
echo 'Noch mal in die Tempdatei' >&4
# Demo
cat "$temp"
|
|
tuxifreund
Projektleitung
Anmeldungsdatum: 7. November 2020
Beiträge: 1151
|
Hallo user_unknown und rklm, vielen Dank für Eure Antworten und Verbesserungen. Das Skript war halt wirklich ein einfaches Skript, dass ich geschrieben hatte, als ich mich gefühlt das erste Mal mit Linux als Server beschäftigte. Ich werde in den nächsten Tagen das Skript ausbauen und wenn ich damit fertig bin, poste ich hier die neue Version. ☺
|
tuxifreund
Projektleitung
Anmeldungsdatum: 7. November 2020
Beiträge: 1151
|
Hallo, irgendwie hatte ich diesen Thread hier ganz vergessen. 😢 user_unknown schrieb: tuxifreund schrieb: | #!/bin/bash
if [ $(id -u) -ne 0 ]; then
echo "Skript muss als Root gestartet werden"
exit 1
fi
|
Wieso muss es als Root gestartet werden?
Stimmt. Irgendwie dachte ich das die Ausgaben von systemd als root passieren müssen, aber das ist ja gar nicht so. Ich habe das Skript mal überarbeitet: 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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 | #!/bin/bash
###############################################################
# (c) 2020 tuxifreund - https://ubuntuusers.de/user/tuxifreund
# s. https://github.com/KaiserBarbarossa/Statusmail
# und folgenden Code anpassen in die /etc/crontab eintragen:
# @hourly root cd /PFAD/ZUM/SKRIPT && bash statusmail.sh
###############################################################
#Grundkonfiguration - bitte anpassen!
MAIL="E-MAIL-ADRESSE" #E-Mail-Adresse des Empfängers
TEMP=$(mktemp)
trap 'rm -f "$TEMP"' 0
#Mailtext
date > $TEMP
hostname >> $TEMP
uname -a >> $TEMP
cat <<MAILTEXT >> "$TEMP"
Sensoren
$(sensors)
-----
Festplattenspeicher
$(df -h)
-----
Uptime
$(uptime)
-----
Status Webserver
$(systemctl status apache2)
Status Postfix
$(systemctl status postfix)
IP-Adresse
$(ip addr)
-----
Netzwerkerreichbarkeit
$(ping -c 2 startpage.com)
MAILTEXT
#Mail versenden
mail -s "Serverstatus" $MAIL < $TEMP
|
Die Variante von, die rklm gezeigt hat, ist wirklich klasse. 👍 LG tuxifreund
|