{"id":68759,"date":"2026-05-06T06:12:39","date_gmt":"2026-05-06T04:12:39","guid":{"rendered":"https:\/\/www.herr-rau.de\/wordpress\/?p=68759"},"modified":"2026-05-06T08:38:27","modified_gmt":"2026-05-06T06:38:27","slug":"bash-skript-und-nemo-actions-eine-collage-erstellen","status":"publish","type":"post","link":"https:\/\/www.herr-rau.de\/wordpress\/2026\/05\/bash-skript-und-nemo-actions-eine-collage-erstellen.htm","title":{"rendered":"Bash-Skript und Nemo Actions: Eine Collage erstellen"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">1. Der Anlass<\/h2>\n\n\n\n<p>Ein- oder zweimal im Jahr brauche ich eine Collage aus Bildern, so wie hier:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full has-custom-border\"><img loading=\"lazy\" decoding=\"async\" width=\"460\" height=\"460\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/linux_bash_collage_ergebnis.jpg\" alt=\"\" class=\"has-border-color has-cyan-bluish-gray-border-color wp-image-68781\" style=\"border-width:1px\"\/><\/figure>\n\n\n\n<p>Daf\u00fcr habe ich kein geeignetes Werkzeug mehr, also habe ich mir eines gebaut, sozusagen einen eigenen Linux-Befehl, der mir aus Bildern in einem Verzeichnis eine Collage erstellt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. Das Anwenden<\/h2>\n\n\n\n<p>Das Anwenden sieht so aus: Ich \u00f6ffne die Kommandozeile in einem Verzeichnis mit Bildern drin und tippe &#8222;collage&#8220; ein, oder auch mit Details &#8222;collage -m 10 -s 200&#8220;. Dann wird mir aus den Bildern in dem Verzeichnis, in dem ich gerade bin, eine Collage erzeugt und in dem Verzeichnis gespeichert.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1074\" height=\"482\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/linux_bash_script_shell2.png\" alt=\"\" class=\"wp-image-68778\"\/><\/figure>\n\n\n\n<p>(Weiter unten steht noch, wie man das auch per Mausklick statt mit der Texteingbe macht.)<\/p>\n\n\n\n<p>Das Skript begann als vom Chatboy erzeugte Datei ohne Komfort und Kommandozeilen-M\u00f6glichkeiten. Nach und nach habe ich den Code verstanden, verbessert, erweitert, so dass ich jetzt auf der Kommandozeile diese Varianten eingeben kann:<\/p>\n\n\n\n<figure class=\"wp-block-table is-style-stripes has-small-font-size\"><table><tbody><tr><td><code>collage<\/code><\/td><td>erstellt eine Collage mit Standardeinstellungen aus den Bildern im aktuellen Verzeichnis, das Ergebnis gespeichert im aktuellen Verzeichnis<\/td><td><\/td><\/tr><tr><td><code>collage -c<\/code><\/td><td>hei\u00dft: beschneidet die Bilder in quadratische Form mit dem Bildschwerpunkt in der Mitte (das ist ohnehin Standardeinstellung)<\/td><td><\/td><\/tr><tr><td><code>collage -u<\/code><\/td><td>wie oben, beschneidet die Bilder aber nicht quadratisch<\/td><td><\/td><\/tr><tr><td><code>collage -s 300<\/code><\/td><td>legt Seitenl\u00e4nge der einzelnen Bilder fest, hier: 300 Pixel<\/td><td><\/td><\/tr><tr><td><code>collage -m 10<\/code><\/td><td>legt Rahmendicke um jedes Bild fest, hier: 10 Pixel<\/td><td><\/td><\/tr><tr><td><code>collage -b white<\/code><\/td><td>legt Rahmenfarbe fest, hier: white<\/td><td><\/td><\/tr><tr><td><code>collage -h<\/code><\/td><td>ruft Hilfe\/Usage auf<\/td><td><\/td><\/tr><tr><td><code>collage <code>\/mnt\/NAS\/Bilder <\/code><\/code><\/td><td>legt absolut oder relativ Quellverzeichnis f\u00fcr die Bilder fest (wenn keines da ist, wird das aktuelle Verzeichnis genommen)<\/td><td><\/td><\/tr><tr><td><code>collage \/mnt\/NAS\/Bilder <\/code>\/home\/rau<\/td><td>legt zus\u00e4tzlich zum Quellverzeichnis auch das Zielverzeichnis fest, in das die Collage gespeichert wird  (wenn keines da ist, wird das aktuelle Verzeichnis genommen)<\/td><td><\/td><\/tr><tr><td><code>collage -s 200 -m 15 -b red  \/mnt\/NAS\/Bilder \/home\/rau<\/code><\/td><td>Kombination von Optionen und Argumenten<\/td><td><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Alle Optionen m\u00fcssen vor den Argumenten kommen und sind ansonsten frei kombinierbar.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Den Befehl \u00fcberall verf\u00fcgbar machen<\/h2>\n\n\n\n<p class=\"has-medium-font-size\">Tats\u00e4chlich kann ich erst einmal das Skript nicht einfach mit seinem Namen aufrufen, sondern muss diesen mit einer absoluten oder relativen Pfadangabe versehen, selbst wenn ich mich im Verzeichnis befinde, in dem das Skript liegt, also <code>.\/collage.sh,<\/code> eventuell gefolgt von Optionen und Argumenten.<\/p>\n\n\n\n<p>Ich will das Skript aber wie jeden anderen Befehl von \u00fcberall und ohne Pfadangabe verwenden. Das geht, indem ich eine Kopie davon, oder eine Verkn\u00fcpfung darauf &#8211; gerne auch als &#8222;collage&#8220; ohne &#8222;.sh&#8220; umbenannt &#8211; in ein Verzeichnis lege, das f\u00fcr solche Befehle vorgesehen ist. Bei mir habe ich zu diesem Zweck das Verzeichnis <code>~\/.local\/bin<\/code> angelegt, und das System angewiesen, dieses Verzeichnis hinzuzuziehen, wenn es darum geht, einen Befehl zu suchen. Das geht, indem ich in der Datei <code>~\/.profile<\/code> die folgenden Zeilen erg\u00e4nze:<\/p>\n\n\n\n<p><code>if [ -d \"$HOME\/.local\/bin\" ] ; then<br>&nbsp;&nbsp;&nbsp; PATH=\"$HOME\/.local\/bin:$PATH\"<br>fi<br><\/code><\/p>\n\n\n\n<p>(Hei\u00dft: Wenn das Verzeichnis ~\/.local\/bin existiert, dann f\u00fcge es zu den \u00fcberwachten Verzeichnissen hinzu. Diese Zeilen gab es bei mir schon, weil in ~\/.local\/bin auch andere Skripte liegen-)<\/p>\n\n\n\n<p>Wenn ich jetzt einen Befehl eingebe, werden nicht nur die voreingestellten Verzeichnisse danach untersucht, sondern eben auch mein eigenes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ins Explorer-Men\u00fc integrieren<\/h2>\n\n\n\n<p>Ich m\u00f6chte die Collage nicht nur \u00fcber die Kommandozeile, sondern auch per Mausklick erstellen; erst einmal, indem ich auf ein Verzeichnis rechtsklicke und dann als Men\u00fcoption die Collage erhalten. Das gilt f\u00fcr den Linux-Explorer namens Nemo, den ich verwende.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1068\" height=\"915\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/linux_bash_script_nemo.png\" alt=\"\" class=\"wp-image-68792\"\/><\/figure>\n\n\n\n<p>Damit das geht, habe ich Im Verzeichnis <code>~\/.local\/share\/nemo\/actions<\/code> eine Datei erg\u00e4nzt, die <code>collage.nemo_action<\/code> hei\u00dft (nur das hinter dem Punkt ist wichtig) und aus folgenden Zeilen besteht:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;Nemo Action]\nActive=true\nName=!Collage erstellen\nComment=Erstelle Collage aus den Bilder in %f\nExec=\/bin\/bash collage %F %P\nSelection=s\nExtensions=dir\nQuote=double<\/code><\/pre>\n\n\n\n<p>Damit habe ich den Men\u00fceintrag erzeugt. Das war nicht mein erster; ich hatte schon mit anderen gespielt. Die Zeilen bedeuten:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>es soll einen Men\u00fcpunkt geben namens &#8222;!Collage erstellen&#8220;<\/li>\n\n\n\n<li>der nur angezeigt wird, wenn man Verzeichnisse ausgew\u00e4hlt hat (Extensions=dir), und zwar auch nur exakt eines davon (Selection=s f\u00fcr single)  und nicht etwa mehrere<\/li>\n\n\n\n<li>bei dessen Aufruf das Collage-Skript aufgerufen wird, und zwar mit zwei Argumenten, n\u00e4mlich Quellverzeichnis (%F, das angeklickte Element) und Zielverzeichnis (%P, das Eltern-Verzeichnis des angeklickten) &#8211; das Skript \u00fcbernimmt die beiden Argumente dann wie vorgesehen<\/li>\n<\/ul>\n\n\n\n<p>Sicher k\u00f6nnte ich das erweitern auf mehrere Verzeichnisse, oder die manuelle Auswahl von Bilddateien in einem Verzeichnis, aber daf\u00fcr, dass ich das eben nur ein- oder zweimal im Jahr brauche, habe ich jetzt schon genug Aufwand getrieben. Das amortisiert sich ja erst in&#8230; einer ganzen Weile. Aber beim Programmieren geht es ja um Prinzip. <em>Theoretisch<\/em> ist das ja eine Arbeits- und Zeitersparnis.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Anhang: Das Skript<\/h2>\n\n\n\n<p>Eigentlich ist das nur viel Drumherum um verschiedene Aufrufe der bestehenden Programme <code>convert<\/code> (um zumeist quadratisch beschnittene Kopien der Bilder zu erstellen) und <code>montage<\/code> (um diese Dann zu einer Collage zusammenzubauen). Beide Programme sind Teil der verbreiteten Suite <code>imagemagick<\/code>. F\u00fcr die Auswertung der Kommandozeile wird au\u00dferdem <code>getopts<\/code> benutzt. Geht das alles auch einfacher oder sauberer? Wahrscheinlich; ich lerne erst noch.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\n\n## Print usage\nusage() {\n  echo -e \"\\nCreate collage \\n\"\n  echo -e \"Usage: $0 -c -u -b &lt;border size&gt; -s &lt;size&gt; -b &lt;color&gt; source_folder destination_folder\"\n  echo -e \"Options:\"\n  echo -e \"-h \\t show usage\"\n  echo -e \"-c \\t crop images to squares\"\n  echo -e \"-u \\t do not crop images to squares\"\n  echo -e \"-m \\t margin, must be followed by value\"\n  echo -e \"-b \\t margin, must be followed by color value\"\n  echo -e \"-s \\t size, must be followed by value\"\n  exit 1\n}\n\n# 1. Vorbereitungen\n\n## Setze Standardwerte\nCROP=true\nSPACING=10\nTARGET_SIZE=400\nBACKGROUND=white\nTEMP_LOCATION=$HOME     # Entscheidungen...\nTEMP_LOCATION=\"\/tmp\"    # Entscheidungen...\nOUTPUT_LOCATION=$(pwd)  # Entscheidungen...\nOUTPUT_LOCATION=$HOME   # Entscheidungen...\nTEMP_DIR=\"${TEMP_LOCATION}\/temp_thumbs\"   # Tempor\u00e4rer Ordner f\u00fcr skalierte Bilder\n\n# 2. Auswertung der Kommandozeilen-Eingabe\n\n## Werte die m\u00f6glichen Optionen aus\nwhile getopts chum:b:s: OPTION; do\n    case $OPTION in\n        c)\n            ;;\n        h)\n            usage\n            ;;\n        u)\n            CROP=false\n            ;;\n        m)\n            SPACING=\"$OPTARG\"\n            ;;\n        b)\n            BACKGROUND=\"$OPTARG\"\n            ;;\n        s)\n            TARGET_SIZE=\"$OPTARG\"\n            ;;\n        \\?)\n            exit\n            ;;\n    esac\ndone\n\n## Werte die Argumente aus\n\n### Passe Argument-Z\u00e4hler an Anzahl der Optionen an\nshift $(($OPTIND - 1))\n\n### Verwende erstes Argument als Input-Location\n\nINPUT_LOCATION=\"$1\"\n\n#### Wenn ein zweites Argument vorhanden, setze als Output-Location\n\nif &#91; \"$#\" -gt 1 ]; then\n    OUTPUT_LOCATION=\"$2\"\nfi\t\n\nOUTPUT=\"${OUTPUT_LOCATION}\/collage_ergebnis.jpg\"\n\n# 3. Hauptteil\n\n## Erstelle tempor\u00e4ren Ordner\nmkdir -p \"$TEMP_DIR\"\n\n## Wechsle in Bilderverzeichnis\ncd \"${INPUT_LOCATION}\"\n\necho \"Schritt 1: Bilder skalieren und eventuell quadratisch zuschneiden...\"\n\n## Z\u00e4hler f\u00fcr die Verarbeitung\ncount=0\n\n## Verarbeite Bilder in einer Schleife \u00fcber die g\u00e4ngigen Bildformate im Verzeichnis\nfor img in *.{jpg,jpeg,png,JPG,JPEG,PNG}; do\n    # Pr\u00fcfe, ob Dateien existieren, um Fehler bei leeren Treffern zu vermeiden\n    &#91; -e \"$img\" ] || continue\n\n    echo \"Verarbeite: $img\"\n\n    if &#91; $CROP == true ]; then\n        # Skalieren und Zuschneiden:\n        # -resize: Skaliert so, dass die k\u00fcrzeste Seite TARGET_SIZE entspricht (^)\n        # -gravity center: Zentriert den Fokus\n        # -extent: Schneidet den \u00dcberhang ab, um ein exaktes Quadrat zu erhalten\n        convert \"$img\" \\\n            -resize \"${TARGET_SIZE}x${TARGET_SIZE}^\" \\\n            -gravity center \\\n            -extent \"${TARGET_SIZE}x${TARGET_SIZE}\" \\\n            \"$TEMP_DIR\/thumb_$count.jpg\"\n    else\n        convert \"$img\" \\\n            -gravity center \\\n            \"$TEMP_DIR\/thumb_$count.jpg\"\n    fi\n    ((count++))\ndone\n\nif &#91; \"$count\" -eq 0 ]; then\n    echo \"Keine Bilder gefunden!\"\n    rm -rf \"$TEMP_DIR\"\n    exit 1\nfi\n\necho \"Schritt 2: Collage erstellen...\"\n\n## Montiere zwischengespeicherte Bilder zusammen\n## -tile: Ohne Angabe (z.B. 4x) berechnet montage das Raster automatisch quadratisch\n\nmontage \"$TEMP_DIR\"\/*.jpg \\\n    -background \"$BACKGROUND\" \\\n    -geometry   \"+${SPACING}+${SPACING}\" \\\n    \"$OUTPUT\"\n\n\n## Erg\u00e4nze einen Rahmen drumherum, damit der den Rahmen der Einzelbilder erg\u00e4nzt\nconvert -bordercolor ${BACKGROUND} -border ${SPACING} \"$OUTPUT\" \"$OUTPUT\"\n\n## L\u00f6sche das tempor\u00e4re Verzeichnis\nrm -rf \"$TEMP_DIR\"\n\necho \"-------------------------------------------\"\necho \"Erfolg! Collage erstellt: $OUTPUT\"\necho \"Verarbeitete Bilder: $count\"\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>1. Der Anlass Ein- oder zweimal im Jahr brauche ich eine Collage aus Bildern, so wie hier: Daf\u00fcr habe ich kein geeignetes Werkzeug mehr, also habe ich mir eines gebaut, sozusagen einen eigenen Linux-Befehl, der mir aus Bildern in einem Verzeichnis eine Collage erstellt. 2. Das Anwenden Das Anwenden sieht so aus: Ich \u00f6ffne die [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":68778,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[25],"tags":[227,333],"class_list":["post-68759","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-informatik","tag-informatik","tag-linux"],"jetpack_featured_media_url":"https:\/\/www.herr-rau.de\/wordpress\/archiv\/linux_bash_script_shell2.png","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/68759","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/comments?post=68759"}],"version-history":[{"count":3,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/68759\/revisions"}],"predecessor-version":[{"id":68802,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/68759\/revisions\/68802"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/media\/68778"}],"wp:attachment":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/media?parent=68759"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/categories?post=68759"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/tags?post=68759"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}