Bestanden zoeken en bewerken
31 augustus 2018 - 10:42   
geplaatst door: uisge
Hallo,

Ik zoek een oplossing voor het volgende vraagstuk:
- In een 'upload'-folder op mijn Mac staat een hoeveelheid bestanden in het formaat AA_bestandsnaam-xx.jpg. Hierbij is xx een volgnummer van het bestand.
- In de 'uploads'-folder heeft subfolders waain bestanden staan en maar 1 heeft de naam bestandsnaam-xx.jpg

Wat ik zou willen is dat ik met bijv. Automator alle folders kan doorzoeken en elke keer als hij een een bestand vindt dat overeenkomt met bestandsnaam-xx.jpg, hij deze ophaalt een resize-bewerking doet, het bestand naar een op te geven locatie kopieert en hernoemt.

Ter illustratie
uploads-folder
AA_bestandsnaamA-68.jpg
AA_bestandsnaamB-01.jpg
AA_bestandsnaamC-106.jpg
AA_bestandsnaamD-30.jpg

SUBfolder
/folder1/bestandsnaamA-13.jpg
/folder1/bestandsnaamA-28.jpg
/folder1/bestandsnaamA-68.jpg
/folder1/bestandsnaamA-90.jpg
/folder2/bestandsnaamB-08.jpg
/folder2/bestandsnaamB-09.jpg
/folder2/bestandsnaamB-10.jpg
/folder2/bestandsnaamB-13.jpg
/folder2/bestandsnaamB-01.jpg
/folder3/bestandsnaamC-08.jpg
/folder3/bestandsnaamC-90.jpg
/folder3/bestandsnaamC-105.jpg
/folder3/bestandsnaamC-106.jpg


Hoe zou ik dit geautomatiseerd kunnen oplossen?

Dank alvast voor het meedenken!
antw: Bestanden zoeken en bewerken
17 september 2018 - 11:07    reactie #1
geplaatst door: uisge
Iemand een idee (ook schopje omhoog)
antw: Bestanden zoeken en bewerken
17 september 2018 - 15:37    reactie #2
geplaatst door: macossie
ik zou kijken in Photoshop -> Bestand -> Automatish -> Batch
of
ABetterFinderRename (19,95)
of
zelf gaan puzzelen met Automator
antw: Bestanden zoeken en bewerken
17 september 2018 - 20:13    reactie #3
geplaatst door: puk1980
Je kunt dit doen met een shell script.

Een overzicht van de bestanden in de map 'uploads':
$ find . -type f
./uploads/AA_bestandsnaamB-01.jpg
./uploads/AA_bestandsnaamA-68.jpg
./uploads/folder2/bestandsnaamB-09.jpg
./uploads/folder2/bestandsnaamB-08.jpg
./uploads/folder2/bestandsnaamB-01.jpg
./uploads/folder2/bestandsnaamB-13.jpg
./uploads/folder2/bestandsnaamB-10.jpg
./uploads/folder3/bestandsnaamC-08.jpg
./uploads/folder3/bestandsnaamC-105.jpg
./uploads/folder3/bestandsnaamC-106.jpg
./uploads/folder3/bestandsnaamC-90.jpg
./uploads/AA_bestandsnaamC-106.jpg
./uploads/AA_bestandsnaamD-30.jpg
./uploads/folder1/bestandsnaamA-13.jpg
./uploads/folder1/bestandsnaamA-28.jpg
./uploads/folder1/bestandsnaamA-90.jpg
./uploads/folder1/bestandsnaamA-68.jpg


Het uitvoeren van het shell script ('doit'):
$ sh doit
convert uploads/AA_bestandsnaamA-68.jpg -resize 50% uploads/folder1/bestandsnaamA-68.jpg
convert uploads/AA_bestandsnaamB-01.jpg -resize 50% uploads/folder2/bestandsnaamB-01.jpg
convert uploads/AA_bestandsnaamC-106.jpg -resize 50% uploads/folder3/bestandsnaamC-106.jpg


De inhoud van het shell script ('doit'):
(Om de conversie uit te voeren dien je nog het 'echo' woord weg te halen.)
DIRNAME=uploads
PREFIX=AA_
UPLOADS=`ls $DIRNAME/*.jpg`
FOLDERS=`ls $DIRNAME | grep folder`

for jpg in $UPLOADS
do
   name=`basename $jpg | sed "/$PREFIX/s///"`
   for folder in $FOLDERS
   do
      NEWNAME=$DIRNAME/$folder/$name
      if [ -f $NEWNAME ]; then
         echo convert $jpg -resize 50% $NEWNAME
      fi
   done
done




Foto's resizen kun je doen met de gratis ImageMagick convert tool.
antw: Bestanden zoeken en bewerken
19 september 2018 - 22:13    reactie #4
geplaatst door: uisge
@puk1980 dank je wel voor het willen uitwerken in een script.

Zie dat in mijn uitleg 'folder...' staat en begrijp dat je dit 1:1 hebt over genomen, de werkelijkheid is echter -en dat wilde ik aangeven- dat de naam van 'folder...' allerlei namen kan hebben. Is daar nog een variant voor?

ImageMagick is me bekend.
antw: Bestanden zoeken en bewerken
19 september 2018 - 23:05    reactie #5
geplaatst door: puk1980
Ja dat is op te lossen door ‘find’ te gebruiken om in subfolders te zoeken.
En hoe zit het met die “AA_”? Is die wel letterlijk, of kan dat ook van alles zijn?

(Oplossing komt morgen, typ nu vanaf de iPad, bijna bedtijd...)
antw: Bestanden zoeken en bewerken
20 september 2018 - 07:07    reactie #6
geplaatst door: uisge
:) AA_ staat eigenlijk voor FB_ en om het nog leuker te maken, ik ben erachter gekomen dat 'FB' ook op andere plaatsen in de string kan staan; die had ik niet voorzien.....
antw: Bestanden zoeken en bewerken
22 september 2018 - 16:57    reactie #7
geplaatst door: puk1980
Je had nog een update tegoed.

$ find . -type f
./uploads/aap/bestandsnaamA-13.jpg
./uploads/aap/bestandsnaamA-28.jpg
./uploads/aap/bestandsnaamA-90.jpg
./uploads/aap/bestandsnaamA-68.jpg
./uploads/noot/bestandsnaamB-09.jpg
./uploads/noot/bestandsnaamB-08.jpg
./uploads/noot/bestandsnaamB-01.jpg
./uploads/noot/bestandsnaamB-13.jpg
./uploads/noot/bestandsnaamB-10.jpg
./uploads/mies/bestandsnaamC-08.jpg
./uploads/mies/bestandsnaamC-105.jpg
./uploads/mies/bestandsnaamC-106.jpg
./uploads/mies/bestandsnaamC-90.jpg
./doit
./upload/FB_bestandsnaamB-01.jpg
./upload/FB_bestandsnaamA-68.jpg
./upload/FB_bestandsnaamD-30.jpg
./upload/FB_bestandsnaamC-106.jpg

$ cat doit
SRCDIR=upload
DSTDIR=uploads
PREFIX=FB_
UPLOAD=`ls $SRCDIR/*.jpg`

for src in $UPLOAD
do
   name=`basename $src | sed "/$PREFIX/s///"`
   dst=`find $DSTDIR -name "$name"`
   if [ "$dst" != "" ]; then
      echo convert $src -resize 50% $dst
   fi
done

$ sh doit
convert upload/FB_bestandsnaamA-68.jpg -resize 50% uploads/aap/bestandsnaamA-68.jpg
convert upload/FB_bestandsnaamB-01.jpg -resize 50% uploads/noot/bestandsnaamB-01.jpg
convert upload/FB_bestandsnaamC-106.jpg -resize 50% uploads/mies/bestandsnaamC-106.jpg

antw: Bestanden zoeken en bewerken
23 september 2018 - 12:47    reactie #8
geplaatst door: uisge
Dank je voor het bijwerken. Snap hoe je aanpak is, alleen blijft $dst op de een of andere manier leeg en gebeurt er niet.

Ik heb bijgesloten een bestand waarin de string FB voorkomt. Heb het aanvankelijk conceptueel willen uitleggen, maar denk nu dat het effectiever is als je detailinfo ziet. Je kunt in het bestand zien dat het dan ook subdirectories zijn waar dit foto-bestand zich in bevindt. De truuk gaat er nu om om die bestanden in 'uploads' subfolders en zijn subfolders te vinden waar geen FB inzit. Door de jaren ben ik niet consistent geweest met waar FB staat   :music:

Ik wil eigenlijk vanuit het originele bestand een resize doen; de FB-bestanden zijn al kleiner gemaakt en die upscalen, loopt de kwaliteit terug.

Kun je hier iets mee?
antw: Bestanden zoeken en bewerken
23 september 2018 - 14:41    reactie #9
geplaatst door: puk1980
Je kunt het bestand met FB filenamen ook als input gebruiken voor het script.
Vervolgens test je of je in de 'upload' map de originelen hebt staan.
Zo ja, dan gebruik je het origineel om te converteren naar een nieuw FB exemplaar.


SRCDIR=upload
S0="/\\.\\/FB_/s///"
S1="/\\/FB_/s///"
S2="/ - FB/s///"
S3="/_FB/s///"
S4="/-FB/s///"
S5="/FB /s///"

while read dst
do
   # remove the FB tags from the destination filename
   dst1=`echo "$dst" | sed "$S0" | sed "$S1" | sed "$S2" | sed "$S3" | sed "$S4" | sed "$S5"`
   src=$SRCDIR"/"`basename "$dst1"`
   if [ -f "$src" ]; then
      echo convert "$src" -resize 50% "$dst"
   fi
done < content_upload2website.txt

antw: Bestanden zoeken en bewerken
23 september 2018 - 18:25    reactie #10
geplaatst door: puk1980
Nu met zoeken in subfolders in de upload folder (en extra quotes voor spaties in filenamen).


SRCDIR=upload
if [ ! -d "$SRCDIR" ]; then
   echo Folder "$SRCDIR" with originals not found.
   exit 1
fi

S0="/\\.\\/FB_/s///"
S1="/\\/FB_/s///"
S2="/ - FB/s///"
S3="/_FB/s///"
S4="/-FB/s///"
S5="/FB /s///"

while read dst
do
   # remove the FB tags from the destination filename
   dst1=`echo "$dst" | sed "$S0" | sed "$S1" | sed "$S2" | sed "$S3" | sed "$S4" | sed "$S5"`
   name=`basename "$dst1"`
   src=`find "$SRCDIR" -name "$name"`
   if [ "$src" != "" ]; then
      echo convert '"'"$src"'"' -resize 50% '"'"$dst"'"'
   else
      echo "$name" not found in folder "$SRCDIR"
   fi
done < content_upload2website.txt

antw: Bestanden zoeken en bewerken
23 september 2018 - 19:02    reactie #11
geplaatst door: uisge
Deze gaat al veel beter :) heb de output naar een bestandje gestuurd, dus zowel van de if als van de else. De naamgeving van de input is niet in alle gevallen consistent; ik zie nu bijv. dat er namen zonder volgnummer zijn. Ga eens doorlopen wat er nu feiten geconverteerd is (ook daar zit bestand van bij)