[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: rename filenames



Wouter Verhelst schreef op 2013-03-25 15:26:
On 25-03-13 14:45, Frans van Berckel wrote:
Hoe zoek je met het find commando in Linux, naar bestanden met een
overbodige spatie voor de extensie?

Je moet die escapen. Als je weet wat de extensie is, dan wordt het iets
in de aard van:

find <directory> -name " .extensie"

weet je dan niet, dan moet je gaan regexen:

find <directory> -regex " .[^.]*$"

is iets minder performant, maar werkt wel voor alle extensies.

daarbij zeg ik: zoek een bestand met een naam waarvan het laatste punt
in de naam vooraf gegaan wordt door een spatie.

Dit getest maar vind zo geen matches. Wat kan er fout gaan?

En hoe hernoem je deze vervolgens?

Even als voorbeeld dan moet 'foo bar extra spaces .extention' 'foo
bar.extention' gaan heten. Heeft iemand hier ervaring mee?

Dat wordt wat interessanter. Je wilt waarschijnlijk iets doen in de
stijl van:

#!/bin/bash

while [ ! -z "$1" ]
do
  NAME="$1"
  shift
  BASE="${NAME%.*}"
  EXT="${NAME#$BASE}"
  BASE="$(echo "$BASE" | sed -e 's/ *$//')"
  mv "$NAME" "${BASE}.${EXT}"
done

${varname%pattern} gooit een suffix, gedefinieerd door het patroon, weg
(in dit geval is de suffix "iets wat begint met een punt").

${varname#pattern} gooit een prefix, gedefinieerd door het patroon, weg (in dit geval is de prefix een variabele die we net gedefinieerd hebben als de basisnaam van je bestand). Je hebt dus een variabele $EXT met de
extensie van je bestandnaam, en $BASE met de basename van je
bestandnaam. Je zou ook het programma "basename" kunnen gebruiken, maar dan moet je de extensie al kennen (en da's ook een fork() meer, dus iets
minder performant).

Vervolgens gebruik ik sed om trailing spaces uit je basename weg te
gooien. Het is VZIW helaas niet mogelijk om dat met zo'n variable
manipulations te doen, dus gebruiken we hier sed.

dat voer je dan aan xargs, like so:

find <directory> <filter> -print0 | xargs -0 <naam van script>

waarbij <filter> één van de twee filters eerder uit deze mail is.

De optie '-print0' zorgt er voor dat find de argumenten NUL-separated
uitvoert; de '-0' optie van xargs verwacht bestandnamen in dat formaat.
Vermits je met bestanden met spaties werkt, is dat absoluut
noodzakelijk, anders gaat er één en ander mislopen.

Mag ik je bedanken? Zeker ook voor de toelichting. Ga even kijken wat er met find fout gaat, maar dan moet het hiermee lukken.

Met vriendelijke groet,


Frans van Berckel


Reply to: