2010-12-26, 23:32
  #1
Medlem
X_surfers avatar
Hej!

Har lyckats fucka upp ID3-taggarna för en stor mängd MP3-filer, så att artistnamnet i taggen är satt till Blandade artister, däremot finns ju det riktiga artistnamnet kvar i filnamnet, det jag skulle vilja göra är ett script som läser filnamnet i varje mp3-fil och delar av strängen den får från filnamnet vid bindestrecket så om filnamnet vore Dubliners - Whiskey In The Jar så skulle scriptet läsa strängen och lägga Dubliners i en variabel och Whiskey in the jar i en annan och sen göra samma sak med nästa filnamn, har googlat mig blå över hur man gör det här men inte lyckats hitta nåt relevant.

Så det jag vill veta är alltså, hur delar jag en sträng när jag stöter på bindestrecket (-) och lägger innehållet i 2 variabler?
antar att find -name *-*.mp3 exec

Vore en bra början men sen då?

Tanken är att sen anropa id3 -a med variabelnamnet som innehåller artistnamnet.

Går det dessutom att ta bort inledande spårnummer från filnamnet vore det kanon, ursäkta om posten vart rörig.
Citera
2010-12-27, 05:06
  #2
Medlem
R.W.Cheeses avatar
Det absolut bästa vore nog att använda Perl el.dyl (något som erbjuder bättre stränghantering).

I Bash är det problematiskt att loopa över fillistor med filnamn som innehåller mellanrum eftersom loopen ser mellanrummet som en avgränsare till nästa värde. Därför behöver man ändra vad Bash anser vara en sk. fältavgränsare, värdet för det finns i $IFS.

Lyckas man med ovan nämnda problem så tror jag att sed är lämpat till liknande uppgifter, men sed verkar ju kräva par böckers kunskap

Fortsätter själv med basename och cut, så här ser (nästan) hela skriptet ut:

Kod:
#/bin/bash

# Back-up av field separator
IFSbu=$IFS
# Ändra field separator till newline
IFS=$'\n'

for i in `find ./ -name \*-\*.mp3`
do
        # Artisten:
        artist=`basename \`echo $i | cut -d'-' -f1\``
        # Låttitel (förutsatt att det är en mp3-fil):
        song=`basename \`echo $i | cut -d'-' -f2\` .mp3`
        echo $artist
        echo $song
done

# Återställ field separator
IFS=$IFSbu

Notera att värdena inte är strippade från föregående och efterföljande mellanrum, lite skoj ska man själv få ha

Edit:
Dessutom blir det problem om det förekommer fler än ett bindestreck i sökvägen pga. cut och värdena för -f (field). Tänker spontant att det borde gå att lösa med grep -o och -c kombinerat (fullösning på fullösning)...
__________________
Senast redigerad av R.W.Cheese 2010-12-27 kl. 05:28.
Citera
2010-12-27, 08:03
  #3
Medlem
hashs avatar
Jag skulle ha använt perl, då stränghantering hanteras oerhört bra där

Men om jag hade vart tvungen att köra ett vanligt shell-script, då hade jag använt sed-kommandot för att splitta filnamnet. Nedan är ett simpelt sed-kommando som gör jobbet och jag är övertygad om att det finns ännu snyggare sed-lösningar än det, men det fungerar iaf.

echo "01 Dubliners - Whiskey In The Jar.mp3" | sed -e 's/^.*\ -\ //' -e 's/\.mp3//'
echo "01 Dubliners - Whiskey In The Jar.mp3" | sed -e 's/\ -\ .*//' -e 's/^[0-9][0-9]\ //'

Du fattar nog hur du skall använda det i ditt script.

Dessvärre kräver ovan att dina filnamn är av samma format, vilket är föga sannolikt om du har många album med olika artister.
__________________
Senast redigerad av hash 2010-12-27 kl. 08:23.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in