Nieuws:

We zijn er weer.

Na lange tijd van afwezigheid zijn we er weer  :laugh:
We hebben alle wachtwoorden gereset, je oude wachtwoord werkt niet meer.Je moet via het "wachtwoord vergeten"-linkje je wachtwoord resetten. Je krijgt hiervoor een mailtje op het adres dat je bij ons geregistreerd hebt.

De komende tijd zijn we nog druk bezig om de rest van de site op te bouwen, dus het kan zijn dat sommige onderdelen (tijdelijk) niet werken.

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

Auteur Topic: BASH code. Weergeeft niet wat ik wil.  (gelezen 578 keer)

Offline bartveurink

  • Lid
  • Steunpunt: Nee
BASH code. Weergeeft niet wat ik wil.
« Gepost op: 2014/09/14, 11:34:21 »
De bedoeling van dit script is dat het alle mappen en bestanden weergeeft die met een bepaalde letter beginnen. Deze letter word op de commandline als argument ingevoerd. Het programma moet van de gevonden resultaten de parent directory niet weergeven. Dat word in het script gedaan met basename. Alleen worden na het toevoegen van basename de bestanden van de subdirectory's niet weergeven.

#!/usr/bin/bash
path_music="/media/bart/SAMSUNG/MUSIC/"
letter="$1"
for file in "`find "$path_music" -iname "$letter*"`"
do
echo $(basename "$file")
done

Offline vanadium

  • Lid
  • Steunpunt: Nee
Re: BASH code. Weergeeft niet wat ik wil.
« Reactie #1 Gepost op: 2014/09/14, 13:57:32 »
Voor jou toepassing kan volgende oneliner wellicht volstaan:
find "$path_music" -iname "$letter*" -exec basename "{}" \;

Voor het algemene geval zie ik hier een constructie als volgt:
find "$path_music" -iname "$letter*" -print0 | while IFS= read -r -d $'\0' file; do
    basename "$file"
done

Waarom het met jou specifieke constructie niet lukt, is mij niet duidelijk: bash is een ingewikkeld ding. Het is alsof de loop maar één keer loopt, en basename dus alles afstript voor de laatste bestandsnaam. Door anderzijds de quotes rond "find" te verwijderen, worden bestandsnamen met spatie uiteengehakt.

Offline bartveurink

  • Lid
  • Steunpunt: Nee
Re: BASH code. Weergeeft niet wat ik wil.
« Reactie #2 Gepost op: 2014/09/14, 15:05:22 »
Kun je me vertellen wat dit deel van de code doet?
-exec basename "{}" \;
En van het tweede stukje code dit deel:
-print0 | while IFS= read -r -d $'\0' file

Offline vanadium

  • Lid
  • Steunpunt: Nee
Re: BASH code. Weergeeft niet wat ik wil.
« Reactie #3 Gepost op: 2014/09/14, 18:32:32 »
Het commando dat na -exec komt, wordt uitgevoerd voor elk resultaat van find. Dat resultaat wordt als argument aangeduid als "{}". \; geeft aan dat dit het einde is van het commando.

Tweede commando: Hier uitleg over de IFS variabele. -print0 zorgt ervoor dat find \0 gebruikt in plaats dan een return als delimiter tussen zijn resultaten. Zo is de uitvoer van find één lange string. "read" in de while loop leest die string in, en wordt met de -d (delimiter) optie ingesteld om eveneens \0 te gebruiken. Elk stukje tot aan \0 wordt dus telkens ingelezen in de variabele file, zodat daar binnen de do-done loop iets mee gedaan kan worden.  Het stukje IFS= zet vooraf de "internal field separator" op niets, zodat bash niet meer splitst op de gewone delimiters, nl spatie, tab of newline.

Offline kuifje09

  • Lid
Re: BASH code. Weergeeft niet wat ik wil.
« Reactie #4 Gepost op: 2014/09/25, 14:28:16 »
De dubbel quotes rond de find zijn de boosdoener. Het resultaat van de find wordt daardoor 1 string...
Daardoor gaat basename protesteren.
« Laatst bewerkt op: 2014/09/25, 14:30:10 door kuifje09 »