Script: strip filenames

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

Script: strip filenames

Berichtdoor Mogenblue » Ma 12 Sep 2022, 10:28

Bij het overzetten van bestanden van Linux naar Android ben ik tegen beperkingen aangelopen. Je kunt niet alle tekens die je onder linux voor een bestand kan gebruiken ook onder Android gebruiken.
Ik heb op verschillende manieren geprobeerd om die bestanden er toch op te krijgen. Zo heb ik ze ook ingepakt in een zipfile en daar laten uitpakken, maar dat hielp ook niet.

Daarom heb ik een script gemaakt om de bestandsnamen aan te passen zodat de verkeerde tekens worden vervangen of weggehaald. Uiteindelijk bleven er maar twee tekens over die Android niet pikt, de dubbele punt (:) en de dubbele quote ("). Ik dacht eerst dat er nog veel meer tekens niet waren toegestaan, haakjes bijvoorbeeld, maar die bleken wel gewoon te kunnen.

Het omzetten gebeurt met twee scripts. Eén stuurscript dat in de scripts map voor het contextmenu van Nemo staat en een verwerkings script dat in je scripts map staat. Je kan ze natuurlijk samenvoegen, maar ik heb veel geschaafd aan het verwerkings script en dan is het makkelijk als dat wat dichterbij staat.
Je kunt het script ook uitbreiden met extra vervangings regels als je een mappenlijst hebt die je wilt uniformeren. Als je daarmee aan de slag gaat adviseer ik je om eerst een duplicaat van de map te maken en in die duplicaat aan de gang te gaan. Want voor je het weet moet je een backup teruglezen...

Het verwerkings script heet strip-filename.sh en dit staat er in

Code: Selecteer alles

#!/bin/bash


#In general, to replace the first match of $substring with $replacement:
#${string/substring/replacement}

#To replace all matches of $substring with $replacement:
#${string//substring/replacement}

#Note that this applies to a variable named $string.

echo .
echo .
echo .
echo .


# set targetfile
TargetFile="$InputFile"


# Replace special characters in targetfile
TargetFile="${TargetFile//:/ -}"
TargetFile="${TargetFile//\"/\'}"


# replace dubbele spaties in targetfile
TargetFile="${TargetFile// / }"


# hernoem het bestand
mv "$InputFile" "$TargetFile"


Zoals je ziet staat er een linkerslash (\) voor de dubbele quote. Die dubbele quote moet namelijk ge-escaped worden omdat het een speciaal teken is. De dubbele punt is een gewoon teken dus daar hoeft geen linkerslash voor te staan.
Voor het cosmetisch effect van de naam staat er ook een regel in om dubbele spaties te verwijderen.

Als je wil kun je extra regels toevoegen om teksten gelijk te trekken. Bijvoorbeeld:
TargetFile="${TargetFile//no./No.}"

Je kunt de doelvariabele gewoon opnieuw gebruiken. Maar je moet de vervanging wel tussen dubbele quotes zetten want het gaat om een bestandsnaam waar spaties in kunnen staan. Als er spaties in staan zijn quotes verplicht. En als er variabelen of opdrachten tussen de quotes worden gebruikt moet het tussen dubbele quotes staan.
Zonder die dubbele quotes gebeurt er niets.

Het stuurscript heet multi-strip-filename.sh en dat bevat het volgende:

Code: Selecteer alles

#!/bin/bash

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


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


for InputFile in "${ImageFileList[@]}"
do

(
# text in filenames veranderen
source '/home/Mogenblue/scripts/strip-filename.sh'
) &

done

# wacht tot alle achtergrondprocessen zijn voltooid
wait

Dit script roept dus het verwerkingsscript aan en doorloopt het in de achtergrond. Daardoor kunnen meer bestanden tegelijk worden verwerkt zodat het proces wordt versneld. In de achtergrond starten doe je door het codeblok tussen haakjes te zetten en er dan een ampersand (&) achter te zetten.
Met het wait commando wordt gewacht tot alle achtergrondprocessen zijn voltooid.
Er wordt geen uitvoer naar het scherm gegeven, maar je ziet vanzelf in je bestandsbeheerder de namen veranderen. In een paar tellen is het gebeurd.

Het stuurscript moet uitvoerbaar worden gemaakt en dan gekopieerd naar de scripts map van Nemo:
/home/Mogenblue/.local/share/nemo/scripts/multi-strip-filename.sh

Als je alles goed gedaan hebt kun je dan een reeks mappen of bestanden selecteren en via het contextmenu -> scripts het vervangings script aanroepen.


Bron: Stackoverflow: Replacing some characters in a string with another character
Gebruikersavatar
MenthaSuaveolens
Senior
Senior
Berichten: 219
Lid geworden op: Vr 23 Mar 2018, 11:41

Re: Script: strip filenames

Berichtdoor MenthaSuaveolens » Do 15 Sep 2022, 17:23

Prima. Het is wel beter om in scripts niet je absolute home-folder te vermelden, zoals bv. /home/Mogenblue, maar $Home of ~ te gebruiken.
Gebruikersavatar
Mogenblue
Held
Held
Berichten: 311
Lid geworden op: Wo 18 Okt 2017, 08:27
Locatie: Amsterdam

Re: Script: strip filenames

Berichtdoor Mogenblue » Do 15 Sep 2022, 17:55

Ik vind het prettiger om het helemaal uit te schrijven omdat je dan beter ziet wat er bedoeld wordt. Je hoeft minder te raden of te onthouden.

Maar als je scripts deelt met meerdere personen, bijvoorbeeld in een huishouding, is het wel handiger om $HOME te gebruiken ipv /home/Mogenblue en dergelijke.

Voor mensen die net beginnen met programmeren of scripts schrijven is het ook wat duidelijker. Anders moeten ze ook weten wat $HOME betekent.

Terug naar “Programmeren”

Wie is er online

Gebruikers op dit forum: Geen geregistreerde gebruikers en 2 gasten