Script: Bestanden selecteren en verwerken

Alles over programmeren in Linux
Gebruikersavatar
Mogenblue
Held
Held
Berichten: 351
Lid geworden op: Wo 18 Okt 2017, 08:27
Locatie: Amsterdam

Script: Bestanden selecteren en verwerken

Berichtdoor Mogenblue » Zo 21 Mar 2021, 12:32

In Nemo is het mogelijk om je eigen scripts aan het context menu toe te voegen. Daardoor kun je een reeks bestanden selecteren en die via het contextmenu direct laten verwerken.

Dat werkt veel makkelijker dan handmatig verwerken. Want wat je daarmee automatiseert is dit:
- ga naar de map waar je script staat
- open je script
- pas het pad en de bestandnaam aan naar die van het bestand dat je wil verwerken
- sla het bestand op en sluit het
- laat het script uitvoeren
- herhaal voor elk bestand dat moet worden verwerkt

Je kunt dus een reeks bestanden tegelijk laten verwerken wat het allemaal veel prettiger maakt.
Het gaat allemaal met een paar klikken van de muis.


Het volgende voorbeeld kan gebruikt worden om reeksen van bestanden tegelijk te verwerken. Het is op allerlei manieren aan te passen aan je eigen wensen.
De eigenlijke verwerking van het bestand staat in een apart script. Hiervoor is gekozen omdat de verwerking vrij complex kan zijn en nogal een lang script kan worden. Als je dat moet debuggen moet je na iedere wijziging het script opnieuw in de nemo map voor je scripts zetten. Op deze manier hoef je alleen het sturende script in de nemo map te zetten en kun je het eigenlijke verwerkingsscript zonder verdere omhaal steeds weer aanpassen.

Overigens kun je het pad en de bestandsnaam van je verwerkingsscript eenvoudig in het stuurscript opnemen. Je klikt op het verwerkingsscript en selecteert kopiëren, dan ga je naar het stuurscript en kiest daar bij source voor plakken. Het systeem is slim genoeg om te begrijpen dat je daar het pad en bestandsnaam nodig hebt en niet de inhoud van dat bestand. Zo kun je ook heel eenvoudig playlists samenstellen. Maar dat is weer een ander verhaal.


Maak eerst het verwerkingsscript aan. Dit krijgt de naam process-info.sh.

Code: Selecteer alles


#!/bin/bash


echo "$StapTotaal"
echo "# ${FileCount}/${FileTotal} - InputFileName: ${InputFileName}, InputFileExt: ${InputFileExt}."
sleep 3
Sla het bestand op en maak het uitvoerbaar.
Dit is een erg eenvoudig script. Het gaat ook alleen maar om het idee.


Maak vervolgens het stuurscript aan met de naam multi-process-info.sh en kopieer de volgende inhoud daar naartoe.

Code: Selecteer alles


#!/bin/bash

# lees huidige padnaam
CurrentURI=( "$NEMO_SCRIPT_CURRENT_URI" )

# zet invoer bestanden in array
ImageFileList=( "$@" )

# lees aantal invoerbestanden
FileTotal=( "$#" )


#-------------------------------------------------------------------------------------------------------------


# bereken stapgrootte per bestand voor progressbar
Stap=$(echo "scale=0; 100 / $FileTotal" | bc)
StapTotaal=0


(

echo "# CurrentURI: $CurrentURI."
sleep 3

echo "# FileTotal: $FileTotal."
sleep 3


# invoer bestanden verwerken
FileCount=1
for InputFile in "${ImageFileList[@]}"
do

# strip extensie van bestand
InputFileName="${InputFile%.*}"
# strip naam van bestand
InputFileExt="${InputFile##*.}"

# bestand verwerken
source '/home/mogenblue/scripts/process-info.sh'


# update progressbar
let StapTotaal=StapTotaal+Stap
echo "$StapTotaal"

(( FileCount++ ))
done


# wordt alleen getoond als auto-close niet is geselecteerd
echo "100"
echo "# alle bestanden zijn verwerkt."


) |
zenity --progress \
--title="Bestanden verwerken" \
--text="Inlezen bestanden ..." \
--percentage=0 \
--no-cancel --width=1000


# variaties voor opties van het zenity commando
# --percentage=0 --pulsate \
# --auto-close --no-cancel --width=600 --height=200
# --no-cancel --width=800
Bij source moet je het pad en de bestandsnaam van je eigen script invullen.
Dit stuurscript moet ook uitvoerbaar worden gemaakt.


Nu moet je het stuurscript kopiëren naar de nemo map.
Open Nemo
Kopiëer het stuurscript
Klik in de menubalk op Bewerken
Klik op Invoegsels
In het venster script moet je rechtsonder op het map icoon klikken.
Dan kom je in de map voor je eigen scripts: .local/share/nemo/scripts
Plak je stuurscript in die map.
Sluit het venster.
Sluit de Invoegsels.

Klaar. Nu kun je een reeks bestanden selecteren en automatisch laten verwerken.
Door het source commando in het stuurscript wordt de inhoud van het verwerkingsscript in het stuurscript ingelezen. Dat betekent dat de variabelen van het stuurscript ook beschikbaar zijn voor het verwerkingsscript.



Links waar ik mijn wijsheid heb gevonden:
Convert command line arguments into an array in Bash
How do I find the number of arguments passed to a Bash script?
Extract filename and extension in Bash
How to check if a variable is set in Bash?
Gebruikersavatar
Mogenblue
Held
Held
Berichten: 351
Lid geworden op: Wo 18 Okt 2017, 08:27
Locatie: Amsterdam

Re: Script: Bestanden selecteren en verwerken

Berichtdoor Mogenblue » Zo 21 Mar 2021, 16:45

Een werkend voorbeeld om afbeeldingen te herschalen naar 4k. Dat kan op de breedte en op de hoogte. Veel afbeeldingen zijn niet precies 16:9 en als je ze in een slideshow gebruikt kun je of een reep aan de boven- en onderkant, of een reep aan de linker- en rechterkant krijgen.
Met dit script worden beide formaten tegelijk aangemaakt en kun je bepalen welke je het mooiste vind. En of je de andere weggooit of niet.


Het script heet image-resize-4k.sh en dit is de code

Code: Selecteer alles


#!/bin/bash

# selecteer image
ImageMap="/home/mogenblue/Afbeeldingen/albums"
ImportName="groot landschap.jpg"
ExportNameBreed="groot landschap-4k-breed.jpg"
ExportNameHoog="groot landschap-4k-hoog.jpg"


#-------------------------------------------------------------------------------------------------------------

# set nieuwe afmetingen
SetBreedte='3840'
AutoHoogte='-2'

AutoBreedte='-2'
SetHoogte='2160'


#-------------------------------------------------------------------------------------------------------------

echo .
echo .
echo .
echo .

# lees bestandnaam van parent script
# ga naar de imagemap als er geen parentscript is
if ! [ -z ${InputFile+x} ]
then
ImportName="$InputFile"
ExportNameBreed="${InputFileName}-4k-breed.${InputFileExt}"
ExportNameHoog="${InputFileName}-4k-hoog.${InputFileExt}"
else
cd "${ImageMap}"
fi

if ! [ -e "${ImportName}" ]
then
echo "Bestand ${ImportName} niet gevonden."
exit
fi


# bijschalen naar breedte in de achtergrond
ffmpeg -loglevel error -i "${ImportName}" -y -filter:v scale=$SetBreedte:$AutoHoogte "${ExportNameBreed}"


# bijschalen naar hoogte in de achtergrond
ffmpeg -loglevel error -i "${ImportName}" -y -filter:v scale=$AutoBreedte:$SetHoogte "${ExportNameHoog}"
Dit bestand moet uitvoerbaar zijn gemaakt om te kunnen uitvoeren. Je kunt het testen met een enkel bestand.


Dan nu het multi script. Dat heet multi-image-resize-4k.sh en dit staat er in:

Code: Selecteer alles


#!/bin/bash

# zet invoer bestanden in array
ImageFileList=( "$@" )


# lees aantal invoerbestanden
FileTotal=( "$#" )


#-------------------------------------------------------------------------------------------------------------


# bereken stapgrootte per bestand voor progressbar
Stap=$(echo "scale=0; 100 / $FileTotal" | bc)
StapTotaal=0


(

# invoer bestanden verwerken
FileCount=1
for InputFile in "${ImageFileList[@]}"
do

# strip extensie van bestand
InputFileName="${InputFile%.*}"
# strip naam van bestand
InputFileExt="${InputFile##*.}"

(
# bestand verwerken
source '/home/frits/Documenten/Computer/scripts/image scripts/image-resize-4k.sh'
) &

# update progressbar
let StapTotaal=StapTotaal+Stap
echo "$StapTotaal"

(( FileCount++ ))
done

# wacht tot alle processen zijn voltooid
echo "98"
echo "# Bezig met verwerken. Even wachten ..."
wait


# wordt alleen getoond als auto-close niet is geselecteerd
echo "100"
echo "# alle bestanden zijn verwerkt."
sleep 1


) |
zenity --progress \
--title="Bestanden verwerken" \
--text="Inlezen bestanden ..." \
--percentage=0 \
--auto-close --no-cancel --width=600


# --percentage=0 --pulsate \
# --auto-close --no-cancel --width=600 --height=200
# --no-cancel --width=1000
Dit script moet eveneens uitvoerbaar zijn gemaakt.

Merk op dat het source commando met de verwijzing naar het verwerkende script tussen aanhalingstekens staat en wordt afgesloten met een & teken.
Dit is een opdracht aan de shell om alles wat binnen de aanhalingstekens staat in een achtergrondproces uit te voeren. Dit kan een significante snelheidswinst opleveren als je een cpu hebt met meerdere threads en je een reeks bestanden verwerkt.

Door de wait opdracht zal het hoofdproces wachten tot alle achtergrondprocessen voltooid zijn voordat ie verder gaat.

Terug naar “Programmeren”

Wie is er online

Gebruikers op dit forum: Geen geregistreerde gebruikers en 23 gasten