Ergebnis 1 bis 5 von 5

Thema: Shell Snippets

  1. #1
    since 1998

    Moderator

    Avatar von theSplit
    Registriert seit
    Aug 2014
    Beiträge
    25.427
    ngb:news Artikel
    4

    Shell Snippets

    Hallo in die Runde,

    ich würde gerne ein Sammelthema bezüglich "Shell snippets" starten, bei dem wir nützliche Skripte hier sammeln und mit anderen teilen können.
    Achte bitte darauf, wenn eure Skripte etwas löschen oder erstellen und oder Rekursiv arbeiten, das dies in der Beschreibung ersichtlich ist, vor einer möglichen Ausführung!

    Dann fange ich mal an mit einem Skript an:

    Bash:

    Funktion:
    Das Skript arbeitet einen Zielordner rekursiv ab, womit ffmpeg alle Videodateien als .mkv kodiert. Ich brauche das Skript dafür, um für meinen EbookReader, mit Videowiedergabe, Videos in ein spielbares Format umzukodieren. Der Ordner der Ausgabe der Videodatei ist mit dem Inputordner identisch.

    Achtung: Der Befehl löscht die Quelldateie(n) mittels rm, wenn das umkodierte Video als .mkv existiert nach der Ausführung von ffmpeg. (Zeile 14)

    Das Skript sollte wie folgt aufgerufen werden: convert.sh Pfad/VideoQuellordner mit Videoordnern/Dateien.


    Spoiler: 

    Code (Bash):
    1. #!/bin/bash
    2.  
    3. function traverseFolders {
    4.     for entry in "$1"/*
    5.     do
    6.         if [[ -d $entry ]]; then
    7.             echo "$entry"
    8.             traverseFolders "$entry"
    9.         else
    10.             FILE=$entry
    11.             echo "Start encoding ${FILE} to ${FILE%.*}.mkv"
    12.             ffmpeg -v 0 -stats -i "$FILE" "${FILE%.*}.mkv"
    13.             if [[ "${FILE%.*}.mkv" ]]; then
    14.                 rm "$FILE"
    15.             fi
    16.         fi
    17.     done
    18. }
    19.  
    20. traverseFolders "$1"
    21.  


    Update:
    Hier eine verbesserte Version des Skripts.

    Spoiler: 


    Code (Bash):
    1. #!/bin/bash
    2.  
    3. TARGETFORMAT=".mkv"
    4.  
    5. function traverseFolders {
    6.     for entry in "$1"/*
    7.     do
    8.         if [[ -d $entry ]]; then
    9.             echo "$entry"
    10.             traverseFolders "$entry"
    11.         else
    12.             FILE=$entry
    13.             if [[ ! "${FILE%.*}$TARGETFORMAT" ]]; then
    14.                 echo "Start encoding ${FILE} to ${FILE%.*}$TARGETFORMAT"
    15.                 ffmpeg -v 0 -stats -i "$FILE" "${FILE%.*}$TARGETFORMAT"
    16.                 if [[ "${FILE%.*}$TARGETFORMAT" ]]; then
    17.                     echo "${FILE%.*}$TARGETFORMAT encoded. Removing src file."
    18.                     rm "$FILE"
    19.                 fi
    20.             else
    21.                 echo "${FILE%.*}$TARGETFORMAT is already present. Skipping transcoding."
    22.             fi
    23.  
    24.         fi
    25.     done
    26. }
    27.  
    28. traverseFolders "$1"
    29.  
    Für diesen Beitrag bedankt sich BurnerR
    Geändert von theSplit (22.06.20 um 19:49 Uhr)

  2. #2
    Bot #0384479 Avatar von BurnerR
    Registriert seit
    Jul 2013
    Beiträge
    4.709
    ngb:news Artikel
    3

    Re: Shell Snippets

    Hier ein paar `.bash_aliases` für den alltäglichen Gebrauch:
    Code (Bash):
    1. alias apt-pull='sudo apt update && sudo apt dist-upgrade -y'
    2. alias lsa='ls -alh --group-directories-first'
    3. alias borg='borg -v -p'
    4. alias borg-latest='borg list --short --last 1'
    5. alias df='df -h'
    6. alias findf='find . -name'
    7. alias git='hub'
    8.  
    9. # We use sudoers NOPASSWD option to allow usage of docker(-compose) without password
    10. # while keeping common sudo logging.
    11. # See https://www.projectatomic.io/blog/2015/08/why-we-dont-let-non-root-users-run-docker-in-centos-fedora-or-rhel/
    12. # for more Info
    13. alias docker='sudo docker'
    14. alias docker-compose='sudo docker-compose'
    Ich hab meine `.bashrc` Kommandos Applikationsweise aufgeteilt für eine bessere Übersicht, so lade ich das ganze:
    Code (Bash):
    1.  
    2. # Iterate over all dot files in .bash-src
    3. # Note that we put a .bashrc-custom there for all other customizations
    4. # Yes, it is this weird to iterate over all dot-files in a directory in bash
    5. # Note that first line inside the loop is neccessary for the case that
    6. # there are no matching files inside the directory
    7. if [ -d ~/.bash-src ]; then
    8.     for file in ~/.bash-src/.[^.]*; do
    9.         [ -e "$file" ] || continue
    10.         . "$file"
    11.     done
    12. fi
    13.  
    Dieses Skript sucht in html Dateien nach dem title-tag und benennt die Dateien entsprechend um:
    Code (Bash):
    1. find . -name "*.html" -exec sh -c "grep -oP '(?<=<title>).*(?=<\/title>)' '{}' | xargs -I@ mv --backup=t '{}' @.html" \;
    Hiermit hab ich für Dateien, die mit "step_" beginnen den String `<%= f.submit "next step"` durch `<%= f.button :submit, "next step" %>` ersetzt. Ist für Ruby on Rails gewesen, aber geht natürlich für jeden String. Das skript macht keine Änderungen an den Dateien, sondern zeigt nur an was ersetzt wird, wenn das entsprechende `inplace` flag bei sed gesetzt wird.
    Code (Bash):
    1. find . -name "step_*" -exec sh -c "sed 's/<%= f.submit \"next step\".*/<%= f.button :submit, \"next step\" %>/g' {} | diff -y {} - | less" \;
    Bash ist so ein verdammter Clusterfuck, ich werde bei nächster Gelegenheit zu etwas wechseln bei dem ich mir nicht die Augen auskratzen will.
    Für diesen Beitrag bedankt sich theSplit

  3. #3
    Vereinsheimer Avatar von Laui
    Registriert seit
    Jul 2013
    Beiträge
    20.619
    ngb:news Artikel
    2

    Re: Shell Snippets

    So manche MKV oder MP4 aus dem Netz sind mit Tags versehen. Ich entferne die immer ganz gerne und das kann man auf diese Weise machen:

    Tags aus MKV entfernen mit mkvpropedit aus dem mkvtoolnix Paket:

    Code (Bash):
    1. for file in *.mkv; do
    2.   mkvpropedit "${file}" --edit info  --set title=
    3. done
    Tags aus MP4 entfernen mit MP4Box aus dem gpac Paket:

    Code (Bash):
    1. for file in *.mp4; do
    2.   MP4Box -itags all=NULL "${file}"
    3. done
    Ich würde es abspeichern als mkv.sh und mp4.sh, in die Ordner mit den mkv respkt. mp4 kopieren, ausführbar machen mit
    Code:
    chmod +x mkv.sh
    chmod +x mp4.sh
    und dann ausführen mit
    Code:
    bash mkv.sh
    bash mp4.sh
    Für diesen Beitrag bedankt sich theSplit
    Geändert von Laui (24.06.20 um 13:05 Uhr)

  4. #4
    Vereinsheimer Avatar von Laui
    Registriert seit
    Jul 2013
    Beiträge
    20.619
    ngb:news Artikel
    2

    Re: Shell Snippets

    Im Grunde mal die Schleife erklärt, was ja auf alle Möglichen Programme mit Parametern übertragbar, so dass der ein oder andere das auch nachbauen kann. Linux sh wohlbemerkt.

    Man sucht eine Möglichkeit mehrere MKV in eine MP4 umzuwandeln ohne Neucodierung und findet im Netz diesen sinnvollen Befehl:

    Code (Bash):
    1. ffmpeg -i file.mkv -codec copy newfile.mp4
    dann sieht der Aufbau so aus

    Code (Bash):
    1. for file in *.mkv; do
    # "for" heisst im Grunde für was für Dateien soll es gehen/für was soll er es machen, for kann man assoziieren mit für, "file" die Bezeichnung für die Datei, kann jeden Namen tragen, "*.mkv*, der Stern, das alle mkv berührt werden sollen, "; do" ist schon für den nächsten Schritt, das ausführen des Programms

    Code (Bash):
    1. ffmpeg -i "${file}" -codec copy "${file}".mp4"
    # "ffmpeg" das Programm, "-i" der erste Parameter, ""${file}"", so am besten schreiben, das bezieht sich auf den obigen selbst vergebenen Namen, "-codec copy" folgen wieder die Parameter, ""${file}.mp4"", der Output laut Befehl, und so erhalten die Dateien die Endung.mp4. Entscheiden ist hier wieder "${file}"

    Code (Bash):
    1. done
    # "done" gehört dazu, dass die Schleife auch danach endet, wenn alle mkv durchgelaufen sind.

    Code (Bash):
    1. for file in *.mkv; do
    2. ffmpeg -i "${file}" -codec copy "${file}".mp4"
    3. done
    Das speichert man als Name.sh ab (wie man sie nennt bleibt einem selbst überlassen, wichtig ist .sh am Ende) und macht es mit
    Code (Text):
    1. chmod +x Name.sh
    ausführbar. Dann kopiert man die sh ins Verzeichnis der Dateien und führt es aus mit
    Code (Text):
    1. bash Name.sh
    Bitte korrigiert mich, wenn ich falsch liege, bzw. man es noch besser erklären kann. Dazu der Hinweis

    Spoiler: 

    Code (Bash):
    1. for i in *.mkv; do
    2. ffmpeg -i "${i}" -codec copy "${i}".mp4"
    3. done
    Jetzt habe ich file einfach i genannt und so sollte das auch klappen, das meine ich mit "kann jeden Namen tragen". Stimmt das?

  5. #5
    since 1998

    Moderator

    (Threadstarter)

    Avatar von theSplit
    Registriert seit
    Aug 2014
    Beiträge
    25.427
    ngb:news Artikel
    4

    Re: Shell Snippets

    Code (Bash):
    1. for file in *.mkv; do
    "For" und "Do" kann man so übersetzen:
    Für Wert/Zeile in *.mkv; mach

    *.mkv ist dann eine Liste (Zeilen) mit je einem Eintrag mit einer ".mkv" Datei der dann in Wert als Variable (je immer eine Zeile) gespeichert wird, damit man darauf zugreifen kann.

    Code (Bash):
    1. for i in *.mkv; do
    2.     ffmpeg -i "${i}" -codec copy "${i}".mp4"
    3. done
    i kann als Variable theoretisch jeden (verfügbaren und nicht anders definierten) Namen haben. "file" und "$file" werden nur genommen, weil man mit einer Datei interagiert und das Sinn macht das Kind auch beim Namen zu nennen.
    Die Anführungszeichen sind auch entsprechend wichtig, falls der Dateiname bzw. Pfad zu der Datei Leerzeichen enthält, diese werden dann entsprechend korrekt verarbeitet.

    Jetzt habe ich file einfach i genannt und so sollte das auch klappen, das meine ich mit "kann jeden Namen tragen". Stimmt das?
    Ja, so lange er nicht anders belegt ist und nicht wie ein Befehl heißt.

    Und noch etwas, du solltest ne "Shebang"-Zeile einfügen:
    #!/bin/bash

    an den Anfang der Datei, was "bash" Skripte auszeichnet.

    Dann kannst du die Skripte auch mit "./name.sh" ausführen. Nach chmod +x.
    Für diesen Beitrag bedanken sich pspzockerscene, Laui
    Geändert von theSplit (26.06.20 um 07:10 Uhr)

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •