Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: pushd en popd wil in script niet werken.  (gelezen 199 keer)

Offline bartveurink

  • Lid
  • Steunpunt: Nee
pushd en popd wil in script niet werken.
« Gepost op: 2017/06/16, 18:35:06 »
In onderstaand script werkt pushd en popd niet. Het script moet alle audio bestanden in een playlist zetten. In iedere subdirectory komt een playlist met de muziek van die directory.

#!/bin/bash

# directory with music
musicdir="/home/bart/MUSIC"

# find all directories in musicdir
for i in "$(find "$musicdir" -type d)"
do
# change to directory
pushd "$i"
# delete playlist.
rm playlist.m3u

for j in *.{mp3,ogg}
do
echo "$j" >> playlist.m3u
done
# change back to directory
popd
done

Offline vanadium

  • Lid
  • Steunpunt: Nee
Re: pushd en popd wil in script niet werken.
« Reactie #1 Gepost op: 2017/06/16, 23:30:45 »
Zoals dit er staat: "$(find "$musicdir" -type d)" denk ik dat je één string meegeeft in plaats van een lijst van folders. Krijg je geen foutmelding waarbij pushd de folder niet vindt? Ik zie ook niet meteen hoe je dit kan oplossen op een "spatie-resistente" manier.

Offline bartveurink

  • Lid
  • Steunpunt: Nee
Re: pushd en popd wil in script niet werken.
« Reactie #2 Gepost op: 2017/06/17, 15:14:34 »
Voor het testen heb ik de regel "echo "$j" >> playlist.m3u" veranderd naar "echo "$j". Bash geeft de volgende output:
./mkplaylists.sh: line 12: pushd: /home/bart/MUSIC/music.bak/NL_ENG
/home/bart/MUSIC/music.bak/NL_ENG/Ilse de Lange
/home/bart/MUSIC/music.bak/NL_ENG/Ilse de Lange/Next to me 2010
/home/bart/MUSIC/music.bak/NL_ENG/Ilse de Lange/Clean Up (2003): No such file or directory
*.mp3
*.ogg
./mkplaylists.sh: line 21: popd: directory stack empty


Offline bartveurink

  • Lid
  • Steunpunt: Nee
Re: pushd en popd wil in script niet werken.
« Reactie #3 Gepost op: 2017/06/17, 15:44:24 »
Als ik de code verander in:
musicdir="/home/bart/MUSIC/music.bak/NL_ENG"
for i in "$(find "$musicdir" -type d)"
do
echo "$i"
# change to directory
pushd $i
ls
popd

done
Krijg ik onderstaande resultaat:
/home/bart/MUSIC/music.bak/NL_ENG
/home/bart/MUSIC/music.bak/NL_ENG/Ilse de Lange
/home/bart/MUSIC/music.bak/NL_ENG/Ilse de Lange/Next to me 2010
/home/bart/MUSIC/music.bak/NL_ENG/Ilse de Lange/The great Escape 2006
/home/bart/MUSIC/music.bak/NL_ENG/Ilse de Lange/Incredible 2008
/home/bart/MUSIC/music.bak/NL_ENG/Ilse de Lange/Dear John
/home/bart/MUSIC/music.bak/NL_ENG/Ilse de Lange/Livin' On Love
/home/bart/MUSIC/music.bak/NL_ENG/Ilse de Lange/World Of Hurt
/home/bart/MUSIC/music.bak/NL_ENG/Ilse de Lange/Live In Ahoy (MP3) 320KB 2Lions-Team
/home/bart/MUSIC/music.bak/NL_ENG/Ilse de Lange/Live In Ahoy (MP3) 320KB 2Lions-Team/INFO 2Lions-Team
/home/bart/MUSIC/music.bak/NL_ENG/Ilse de Lange/Live In Ahoy (MP3) 320KB 2Lions-Team/CD 1
/home/bart/MUSIC/music.bak/NL_ENG/Ilse de Lange/Live In Ahoy (MP3) 320KB 2Lions-Team/CD 2
/home/bart/MUSIC/music.bak/NL_ENG/Ilse de Lange/Clean Up (2003)
~/MUSIC/music.bak/NL_ENG ~/sandbox/code
Ilse de Lange  mkplaylists.sh
~/sandbox/code

Het programma wil blijkbaar maar naar een van de directories pushen. Is het een idee om het in een andere Linux Shell te scripten?

Offline vanadium

  • Lid
  • Steunpunt: Nee
Re: pushd en popd wil in script niet werken.
« Reactie #4 Gepost op: 2017/06/17, 16:26:49 »
Het probleem blijft je quotes rond het find commando: het ganse resultaat wordt in één geheel één keer in de loop gebracht. Doe je de haakjes echter weg, dan spelen de spaties in de bestandsnamen je parten: er wordt nu te veel opgesplitst. Ik zie niet goed hoe dit opgelost kan worden, tenzij als je in de uitkomst van find eerst de spatie kan vervangen door "\ " (een escape ervoor) en daarna de returns door een spatie. m.a.w, je hebt eerst wat string manipilatie nodig voor je het resultaat aan de for loop doorgeeft (zónder die quotes!). De tooltjes "tr" of "sed" kunnen hier bij helpen.

Edit: zal ook niet werken: de spatie achter het escape teken is nog altijd een signaal voor de loop om op te splitsen.

Andere aanpak: zoek de folders met find, en laat via find binnen elke folder een scriptje uitvoeren om playlists aan te maken.

find $musicdir -execdir <je script> \;
« Laatst bewerkt op: 2017/06/17, 16:41:56 door vanadium »

Offline bartveurink

  • Lid
  • Steunpunt: Nee
Re: pushd en popd wil in script niet werken.
« Reactie #5 Gepost op: 2017/06/17, 17:12:20 »
Het probleem is opgelost door bij find met -exec een functie aan te roepen, deze functie staat in hetzelfde script. Zie hieronder:
#!/bin/bash

function mkplaylist(){
dir="$1"
pushd "$dir"
rm playlist.m3u
for j in *{mp3,ogg}
do
echo "$j" >> playlist.m3u
done
popd
dirs -c
}

musicdir="/home/bart/MUSIC"

export -f mkplaylist

find "$musicdir" -type d -exec bash -c 'mkplaylist "{}"' \;

Offline vanadium

  • Lid
  • Steunpunt: Nee
Re: pushd en popd wil in script niet werken.
« Reactie #6 Gepost op: 2017/06/17, 17:37:53 »
Goed zo! Ik had ook in de richting van functies gezocht om alles in één enkel script te kunnen houden, maar ik wist niet hoe de functie vanuit find aan te roepen.

Offline bartveurink

  • Lid
  • Steunpunt: Nee
Re: pushd en popd wil in script niet werken.
« Reactie #7 Gepost op: 2017/06/17, 17:38:58 »
Dat had ik gegoogled