bash n flac


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting bash n flac
# 1  
Old 11-27-2007
bash n flac

Hi All
I'm trying to take a .flac file and use metaflac to write
the tag info into a file, Then read the title portion of the tag and rename the original .flac file with this info.

lets call this script renameflac

now on the command line if I type:
Code:
metaflac myfile.flac --export-tags-to=/tmp/tmp.txt

This puts a file called tmp.txt in the /tmp directory Smilie
and in this file it looks like this:
ALBUM=Self Esteem
ARTIST=The Offspring
COMPOSER=The Offspring
DESCRIPTION=
DISCID=0912a612
GENRE=Just Plain Wierd
MUSICBRAINZ_DISCID=o33.enTD6BY0zF2.Wn..dIpgsFI-
TITLE=Self Esteem
TRACKNUMBER=1
TRACKTOTAL=18

I figure I could grab the TITLE= info to rename the file but I get stuck here:

Code:
#!/bin/bash
for file in *.flac ; do
metaflac $file --export-tags-to=/tmp/tmp.txt
done

renameflac myfile.flac

This just hangs
Is this because the metaflac commands uses its flags after the file name?
And is this even possible with bash?
Thanks for your time.

Last edited by vbslim; 11-27-2007 at 05:18 AM.. Reason: spelling
# 2  
Old 11-27-2007
I don't write bash-scripts, so i can't give you a complete solution, but a few suggestions:

1) If you use a wildcard expansion like "*.flac" and then rename the files matched by that wildcard the results may or may not get obfuscated. Rename the *.flac-files to something intermediate like "*.flac.processed" and in a last step (after the for .... *.flac... do.....done-loop has finished) rename them again.

2) Maybe this is not posing a problem here, but generally it is better not to use the "for file in * ; do ....done", but a pipeline instead:

Code:
find . -prune -name "*" -type f -print | while read file ; do
   ....
done

The reason is: wildcards are expanded by the shell. The shell tries to execute the line "for file in * ; do" and replaces the asterisk with a list of filenames matching it. Only then the command will be executed. If the wildcard now matches a very big list of files chances are you hit the limitation of the input line length (in POSIX 4k characters) and get an error. This will not be the case with the find command and the pipeline.

3) You write a file to /tmp without checking if this is possible. Usually it is, but it is a risk you are taking if you do not check that first. Two problems could arise: /tmp is full and you (your user account) is not allowed to write to there.

Either check first if you can indeed write or work in a pipeline instead of an intermediate file:

Code:
newname="$(metaflac myfile.flac --export-tags-to=- | sed -n 's/^TITLE=//p;q')"

Hope this helps.
bakunin
# 3  
Old 11-27-2007
Thank you!
I belive I understand.
The problem using the find command is that the flac files are
named like this:
01_-_Track_1.flac
and the output file should be
Self_Esteem.flac

Actualy, The more I write and test this the less I understand Smilie

Thanks again for your time bakunin
# 4  
Old 11-28-2007
while this works:

Code:
for file in *.flac ; do
          metaflac $file --export-tags-to=tmp/tmp.txt
           part1=$(awk '{FS="="} /ARTIST/{print $2}' tmp/tmp.txt |sed 's/ /_/g')
           part2=$(awk '{FS="="} /TITLE/{print $2}' tmp/tmp.txt |sed 's/ /_/g')
           mv $file ${part1}_$part2.flac
 mv tmp/tmp.txt tmp/${part1}_$part2.txt
done

This doesn't:

Code:
find . -prune -name "*" -type f -print | while read file ; do
          metaflac $file --export-tags-to=tmp/tmp.txt
           part1=$(awk '{FS="="} /ARTIST/{print $2}' tmp/tmp.txt |sed 's/ /_/g')
           part2=$(awk '{FS="="} /TITLE/{print $2}' tmp/tmp.txt |sed 's/ /_/g')
           mv $file ${part1}_$part2.flac
 mv tmp/tmp.txt tmp/${part1}_$part2.txt
done

Any Idea?
Thanks again
# 5  
Old 11-28-2007
You're pruning everything. You need to let find at least not prune the current directory. Try this one:

find . ! -name . -prune -name \*.flac -type f -print


and by the way, make sure you have read this alert.
# 6  
Old 11-28-2007
Yep, I figured that out earlier, Its amazing what a -v after bash will do Smilie. Thanks!!!
Also Thank you for the alert link Pererabo.
# 7  
Old 11-28-2007
Quote:
Originally Posted by vbslim
Code:
part1=$(awk '{FS="="} /ARTIST/{print $2}' tmp/tmp.txt |sed 's/ /_/g')
part2=$(awk '{FS="="} /TITLE/{print $2}' tmp/tmp.txt |sed 's/ /_/g')

Perderabo has always told you how to solve the find problem - sorry for my sloppiness. Still, the above lines give me headaches: why use two different tools for a purpose where one would suffice?

Code:
part1="$(sed -n '/ARTIST/ {;s/^.*=//;s/ /_/g;p;}' tmp/tmp.txt)"
part2="$(sed -n '/TITLE/ {;s/^.*=//;s/ /_/g;p;}' tmp/tmp.txt)"

does the same.

bakunin
Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

In Bash shell - the ps -ef shows only the /bin/bash but the script name is not displayed

In Bash shell - the ps -ef shows only the /bin/bash but the script name is not displayed ? Is there any way to get the script names for the process command ? --- Post updated at 08:39 AM --- in KSH (Korn Shell), my command output shows the script names but when run in the Bash Shell... (3 Replies)
Discussion started by: i4ismail
3 Replies

2. Shell Programming and Scripting

Different behavior between bash shell and bash script for cmd

So I'm trying to pass certain json elements as env vars and use them later on in a script. Sample json: JSON='{ "Element1": "file-123456", "Element2": "Name, of, company written in, a very weird way", "Element3": "path/to/some/file.txt", }' (part of the) script: for s... (5 Replies)
Discussion started by: da1
5 Replies

3. Shell Programming and Scripting

How to run several bash commands put in bash command line?

How to run several bash commands put in bash command line without needing and requiring a script file. Because I'm actually a windows guy and new here so for illustration is sort of : $ bash "echo ${PATH} & echo have a nice day!" will do output, for example:... (4 Replies)
Discussion started by: abdulbadii
4 Replies

4. Shell Programming and Scripting

Bash to select text and apply it to a selected file in bash

In the bash below I am asking the user for a panel and reading that into bed. Then asking the user for a file and reading that into file1.Is the grep in bold the correct way to apply the selected panel to the file? I am getting a syntax error. Thank you :) ... (4 Replies)
Discussion started by: cmccabe
4 Replies

5. UNIX for Dummies Questions & Answers

Im new to bash scriping and i found this expression on a bash script what does this mean.

# check host value regex='^(||1|2|25)(\.(||1|2|25)){3}$' if ')" != "" ]; then if ]; then echo host $host not found exit 4 fi elif ]; then echo $host is an invalid host address exit 5 fi espeacailly the top regex part? ---------- Post updated at 06:58 PM ---------- Previous update was... (1 Reply)
Discussion started by: kevin298
1 Replies

6. Shell Programming and Scripting

Using arrays in bash using strings to bash built-in true

I have the following code and for some reason when I call the program using /home/tcdata/tatsh/trunk/hstmy/bin/bash/raytrac.bash --cmod=jcdint.cmod I get hasArgument = hasArgument = true Somehow the array element is returning even though I have not chosen the option. ... (41 Replies)
Discussion started by: kristinu
41 Replies

7. Shell Programming and Scripting

automatic script for flac to mp3 conversion

used flac2mp3 (0 Replies)
Discussion started by: barrydocks
0 Replies

8. Shell Programming and Scripting

how to make your bash script run on a machine with csh and bash

hi, i have a script that runs on bash and would like to run it on a machine that has csh and bash. the default setting on that machine is csh. i dont want to change my code to run it with a csh shell. is there any way i can run the script (written in bash) on this machine? in other words is there... (3 Replies)
Discussion started by: npatwardhan
3 Replies

9. Shell Programming and Scripting

bash and ksh: variable lost in loop in bash?

Hi, I use AIX (ksh) and Linux (bash) servers. I'm trying to do scripts to will run in both ksh and bash, and most of the time it works. But this time I don't get it in bash (I'm more familar in ksh). The goal of my script if to read a "config file" (like "ini" file), and make various report.... (2 Replies)
Discussion started by: estienne
2 Replies
Login or Register to Ask a Question