Willkommen Gast. Bitte einloggen oder registrieren. Haben Sie Ihre Aktivierungs E-Mail übersehen?
24.07.2021, 22:20:04

.
Einloggen mit Benutzername, Passwort und Sitzungslänge

Mitglieder
  • Mitglieder insgesamt: 25776
  • Letzte: joba48
Statistiken
  • Beiträge insgesamt: 746688
  • Themen insgesamt: 60054
  • Heute online: 375
  • Am meisten online: 2287
  • (22.01.2020, 19:20:24)
Benutzer Online

Autor Thema:  Skript-Vorlagen, Sammlung, Anfängerhilfen  (Gelesen 664 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Skript-Vorlagen, Sammlung, Anfängerhilfen
« am: 26.12.2020, 17:26:07 »
Hallo,

ich möchte unter Mint18/20, xfce, 64bit, ein paar Skripte für wiederkehrende Aufgaben erstellen. Dabei möchte ich eine oder mehrere Dateien oder vielleicht auch Ordner mit der Maus auf ein Icon des Skripts ziehen, und dieses soll die Elemente dann nacheinander oder nach Möglichkeit auch 2 oder 3 parallel verarbeiten.
Gibt es dafür Vorlagen oder Skript-Schnippsel, die einem Linux-Anfänger das Leben erleichtern?

Unter WindowsXP habe ich mir solche Skripte vor Jahren zusammengestümpert, indem ich mir Teile aus Tutorials zusammengesucht habe. Da ich das nur für den Eigengebrauch benutze, müsste ich auch heute wieder viel Zeit investieren, wenn ich die gleichen Skripte neu erstellen würde. Mir würde es also sehr helfen, wenn ich eine Vorlage hätte, die ich dann nur noch für meine Zwecke leicht anpassen müsste.

Es geht mir in erster Linie um JPGs, die ich mit XnView konvertieren, Dateien, die ich umbenennen und um Videoschnippsel, die ich mit Avidemux transcoden möchte.



Re: Skript-Vorlagen, Sammlung, Anfängerhilfen
« Antwort #1 am: 27.12.2020, 15:29:39 »
Du brauchst lediglich einen Programmstarter (Desktop-Datei), der das Shellskript aufruft und eine Dateiliste übergibt.
Die Befehlszeile im Programmstarter lautet dann z.B.:
/Pfad/Zum/Skript.sh %U
/Pfad/Zum/Skript.sh muss natürlich ersetzt werden und das Skript braucht Ausführrechte. Das %U übergibt die Dateiliste an das Skript. Die Dateiliste entsteht automatisch beim Drauflegen der Dateien auf das Programmstarter-Icon.


Nun noch ein Bash-Skript mit einer Arbeitsschleife, die mit Dateinamen umgehen kann (die dürfen nämlich Sonderzeichen wie z.B. das Leerzeichen enthalten):
#!/bin/bash

for File in "$@"
do

    echo "$File"

done
Die Zeile mit echo steht nur als Beispiel, wie man Befehle mit den einzelnen Dateinamen aufruft.

Beachte die doppelten Anführungszeichen im Skript, sonst klappt es nicht mit den Dateinamen.



Getestet auf dem KDE, sollte aber auch auf anderen Desktops funktionieren.

Re: Skript-Vorlagen, Sammlung, Anfängerhilfen
« Antwort #2 am: 27.12.2020, 19:22:03 »
Vielen Dank. Das hilft mir schon weiter.

Im Moment komme ich bei einer anderen "Kleinigkeit" nicht weiter. Ich möchte das übergebene Objekt darauf testen, ob es eine Datei oder ein Ordner ist und ob im Falle einer Datei ein Punkt enthalten ist. Wenn ein Punkt vorhanden ist, soll davor ein String eingefügt werden, um einen den Zieldateinamen zu erhalten.

Pfad, Dateinamen und Extension bekomme ich grundsätzlich so:

    Verzeichnis="${1%/*}"
    Datei="${1##*/}"
    DExtension="${Datei##*.}"

Die Ermittlung der Erweiterung schlägt aber fehl, wenn der Dateiname keinen Punkt enthält. Mit awk kann man das Vorhandensein eines Strings innerhalb eines anderen Strings feststellen. Das funktioniert auch mit allen anderen Zeichen, die ich getestet habe, nur nicht mit dem "Punkt".

DateiN=$Datei
zeichen="$DateiN"
laenge=`echo $zeichen | awk '{print length($zeichen)}'`
ZeichenVorhanden=0
ZeichenVorhanden=`echo $DateiN | awk '{print match($DateiN,"\.")}'`    ### das hier ist die Problemstelle ###
echo "$zeichen / $DateiN enthaelt $laenge Zeichen"
echo 'Zeichen "." steht an Stelle:' $ZeichenVorhanden

Hat jemand eine Idee, wie ich den "Punkt" matchen kann, bzw. wie ich zuverlässig den einen leeren String in die Variable "DExtension" bekomme, wenn der Dateiname keinen Punkt enthält?


Hinweis: Da ich schon mehrere Varianten (sed, awk, ...) probiert habe, habe ich mehrere Variablen in meinem Testskript.


Re: Skript-Vorlagen, Sammlung, Anfängerhilfen
« Antwort #3 am: 28.12.2020, 13:09:11 »
Oft ist der Punkt ein Sonderzeichen und muss mit einem davorstehendem Backslash entwertet werden.
\.
Edit:
Ups, hast Du ja schon.

Pfad, Dateinamen und Extension bekomme ich grundsätzlich so:

    Verzeichnis="${1%/*}"
    Datei="${1##*/}"
    DExtension="${Datei##*.}"

Die Ermittlung der Erweiterung schlägt aber fehl, wenn der Dateiname keinen Punkt enthält.

DExtension="${Datei##*.}" ; [ "$DExtension" =  "$Datei" ] && DExtension=So ist $DExtension leer, wenn der Dateiname keinen Punkt enthält.
« Letzte Änderung: 28.12.2020, 14:22:51 von Nessie »

Re: Skript-Vorlagen, Sammlung, Anfängerhilfen
« Antwort #4 am: 29.12.2020, 20:43:03 »
Code: [Auswählen]

DExtension="${Datei##*.}" ; [ "$DExtension" =  "$Datei" ] && DExtension=

So ist $DExtension leer, wenn der Dateiname keinen Punkt enthält.

Das funktioniert :-), aber ich weiß nicht warum :-(
Wenn ich das richtig sehe, dann fragst du nach dem Semikolon ab, ob der Dateiname gleich der Erweiterung ist und wenn das so ist, dann löschst du die Erweiterung wieder.
Wenn das tatsächlich so arbeitet, dann würde ich erwarten, dass das beabsichtigte Ergebnis nicht erreicht wird, wenn Dateiname ohne Erweiterung gleich der Erweiterung ist, also z.B. bei /home/mkv.mkv

Irgendwie habe ich mich aber sowieso verrannt, denn die Erweiterung ist gar nicht wichtig, soweit ich das gerade überblicke. Mein Ziel war es, z.B. /home/video.mov in /home/video_q24.mkv umbenennen zu können, bzw. /home/video soll zu /home/video_q24.mkv. Mit
    DoExt="${Datei%\.*}"
    NName=$Verzeichnis"/"$DoExt"_q24.mkv"
sollte das funktionieren.



Re: Skript-Vorlagen, Sammlung, Anfängerhilfen
« Antwort #5 am: 29.12.2020, 23:04:55 »
Du brauchst lediglich einen Programmstarter (Desktop-Datei), der das Shellskript aufruft und eine Dateiliste übergibt.
Die Befehlszeile im Programmstarter lautet dann z.B.:
Code: [Auswählen]

/Pfad/Zum/Skript.sh %U

/Pfad/Zum/Skript.sh muss natürlich ersetzt werden und das Skript braucht Ausführrechte. Das %U übergibt die Dateiliste an das Skript. Die Dateiliste entsteht automatisch beim Drauflegen der Dateien auf das Programmstarter-Icon.

Das will nicht :)

In meinem Skript möchte ich prüfen, ob es sich um eine reguläre Datei handelt, damit nicht versehentlich Verzeichnisse verarbeitet werden.
Damit das Skript auch mehr als 9 Elemente aufnehmen kann, sieht die Struktur dazu so aus:

while [ "$1" != '' ]
  do
    if [ -f $1 ]
      then echo "Führe Skript weiter aus"
      else echo $1 " ist keine reguläre Datei ---> breche ab"
    fi
done

Wenn ich die Dateien in der Kommandozeile übergebe, dann funktioniert obige Abfrage. Z.B.:
./skript.sh /home/test.mp4

"/home/test.mp4" taucht dann auch genau so als String im Terminal auf.

Wenn ich das Objekt aber mit der Maus auf den verknüpften Starter ziehe, dann wird daraus "file:///home/test.mp4" und obiger Test erkennt die Datei nicht mehr als reguläre Datei.
Außerdem ist mir aufgefallen, dass Leerzeichen im Dateinamen über echo als "%20" ausgegeben werden.