Så här t.ex:
Hur skapade du en sån tagg från början?comment[7]: DESCRIPTION=Drum machine programming: Johnny Andersson
Bass guitar: Johnny Andersson
Rhythm guitar: Johnny Andersson
Acoustic guitars: Johnny Rosenberg
Keyboards: Johnny Andersson
Hur skapade du en sån tagg från början?comment[7]: DESCRIPTION=Drum machine programming: Johnny Andersson
Bass guitar: Johnny Andersson
Rhythm guitar: Johnny Andersson
Acoustic guitars: Johnny Rosenberg
Keyboards: Johnny Andersson
Jag har skapat dem med EasyTAG genom att först skriva dem i gedit och sedan klistra in dem i EasyTAG. De funkar också med ganska många program. Entagger visar dem precis som jag tänkt. Tar man egenskaper på filen i Nautilus så visas allt på en rad, men allt visas. I EasyTAG visas också allt på en rad, men varje rad skiljs åt av en liggande rektangel med texten ”000A” i, och i ghex2 kan jag verifiera att det är just tecknet \x0A som skiljer raderna från varandra.ubot skrev:Jo. Just det. Det tänkte jag inte på. Hur har det blivit så att dina taggar ligger på flera rader i en och samma comment[n]? Hur har du gjort för att infoga radbrytning i en tagg?
Så här t.ex:Hur skapade du en sån tagg från början?comment[7]: DESCRIPTION=Drum machine programming: Johnny Andersson
Bass guitar: Johnny Andersson
Rhythm guitar: Johnny Andersson
Acoustic guitars: Johnny Rosenberg
Keyboards: Johnny Andersson
Eller liknande…TRUMMOR=Bertil Stråtesjö
BAS=Bosse Kosseman
KOMPGITARR=Hölasse Frassestedt
KEYBOARD=Handtage Studslund
SOLOGITARR=Johnny Rosenberg
Frågan är bara vilka garantier man har att kommentarerna hamnar i rätt ordning i filen, men de verkar komma i den ordning man lägger in dem.DESCRIPTION=Jöns Hildeström: Trummor, maraccas, tamburin och knallpistol
DESCRIPTION=Cristel Sjögurka: Bas, dammsugare och moraklocka
DESCRIPTION=Johnny Rosenberg: Gitarrer och keyboards
DESCRIPTION= Jöns ramlade av stolen tre gånger under inspelningens gång
DESCRIPTION=Cristels man förstörde bästa tagningen genom att storma in och bjuda på brända wienerbröd och spilla juice över mixerbordet, därav denna halvusla tagning där alla spelar fel hela tiden…
Kod: Markera allt
metaflac -list-tags file.flac | grep -A 1000 "comment\[.*\]" | grep -B 1000 "comment\[.*\]" | sed 's/^[^\ ].*/\\x0A&/' | tr -d '\n' | sed 's/comment\[/\ncomment\[/g'
Kod: Markera allt
#!/bin/bash
# Execute by: ./flacscript.sh "/home/username/Music/" "/path/to/new/files/"
# What is the path to the old files?
path=$(ls -1 $1 | sed 's/[^\/]*$//')
# What is the path to the new files?
newpath=$(ls -1 $2 | sed 's/[^\/]$/&\//')
# Array of file names.
files=( $(ls -1 $1 | grep -o "[^/]*$" | sed 's/^/"/' | sed 's/$/"/' | tr '\r\t\n' ' ') )
# Loop each file one by one.
for file in ${files[@]}; do
# Date and time?
now=$(date +%Y-%m-%d-%H\:%M\:S)
# Copy old file to new file. Add date and time to new file name.
cp $path$file $newpath$file-$now.flac
# Get all tags from old file.
tags=$(metaflac --list $path$file | grep -A 1000 "comment\[.*\]" | grep -B 1000 "comment\[.*\]" | sed 's/^[^\ ].*/\\x0A&/' | tr -d '\n' | sed 's/comment\[/\ncomment\[/g')
# How many comments are there?
comments=$(metaflac --list $path$file | grep "^\ *comment\[.*\]:" | wc -l)
# Loop through each comment one by one.
for (( i=0; i<$comments; i++ )); do
# Add a new tag to the new file.
metaflac --set-tag="$(echo "$tags" | grep "comment\[$i\]:" | sed "s/comment\[$i\]: //")" $newpath$file-$now.flac
# End of loop 2.
done
# End of loop 1.
done
Testade detta (fast i rättad form – det finns inget som heter ”-list-tags” men jag antog att du menade ”--list”) och resultatet blir att den nya filen får kommentarerna på en rad med tecknen \x0A mellan ”raderna”, så det blir alltså inga nya rader.ubot skrev:Det är inte så svårt att anpassa mitt skript så att varje rad som ingår i DESCRIPTION-taggen kommer med men där det blir lika många DESCRIPTION-taggar som rader i ursprungliga DESCRIPTIO-taggen. Jag tycker att det hade varit snyggare att sätta taggar precis som taggarna är på originalfilen. Dvs "klona" taggarna rakt av utan att behöva införa massor av DESCRIPTION-taggar för att få med alla rader. Frågan när bara hur man gör det?
Edit:
Ok, snyggt är det inte men jag tror det fungerar:
Vad tror du om att helt enkelt byta ut newline mot \x0A så att alla rader ligger på en rad men med \x0A mellan raderna? Fungerar det att sätta en tagg som är: DESCRIPTION="Hey Ho\x0ALets Go" som sedan blir två rader när metaflac -list visar taggarna?Kod: Markera allt
metaflac -list-tags file.flac | grep -A 1000 "comment\[.*\]" | grep -B 1000 "comment\[.*\]" | sed 's/^[^\ ].*/\\x0A&/' | tr -d '\n' | sed 's/comment\[/\ncomment\[/g'
Fast jag tänkte i så fall göra om originalt från scratch (det är inte så många original än så länge) och köra med fler kommentarer konsekvent.ubot skrev:Skriptet innehåller samma rad, svar ja. Jag testade också och ser att metaflac --list file.flac skriver ut taggarna på samma rad med \x0A mellan som du sa.
Tja, det är ju enkelt fixat att lägga till --set-tag=DESCIPTION="rad 1", --set-tag=DESCIPTION="rad 2" osv. Problemet är ju att man faktiskt manipulerar taggarna då. Du kommer få massor av comment[n] jämfört med originalet.
Vad försöker du göra här? Vad händer om något filnamn innehåller t.ex. citat-tecken, tab-tecken eller nyrad?ubot skrev:Kod: Markera allt
# Array of file names. files=( $(ls -1 $1 | grep -o "[^/]*$" | sed 's/^/"/' | sed 's/$/"/' | tr '\r\t\n' ' ') ) # Loop each file one by one. for file in ${files[@]}; do
Kod: Markera allt
now=$(ls -l file | grep -Eo "[[:digit:]]{4}\-[[:digit:]]{2}\-[[:digit:]]{2}"\ [[:digit:]]{2}\:[[:digit:]]{2})
Ja, vad försöker jag göra där?Konservburk skrev:Vad försöker du göra här? Vad händer om något filnamn innehåller t.ex. citat-tecken, tab-tecken eller nyrad?ubot skrev:Kod: Markera allt
# Array of file names. files=( $(ls -1 $1 | grep -o "[^/]*$" | sed 's/^/"/' | sed 's/$/"/' | tr '\r\t\n' ' ') ) # Loop each file one by one. for file in ${files[@]}; do
Det är enkelt fixat. Då kör man bara metaflac --remove-all-tags på den nya filen så hoppas jag att metaflac gör jobbet som det står i man metaflac.När det gäller den nya filen, om man har en gammal att plocka taggar ifrån, så kan man ju, för säkerhets skull först radera alla taggar i den nya filen, ifall man exempelvis skulle klanta sig i Audacity så att det kommer dit någon oönskad tagg eller så. Man kan ju i så fall använda ”--remove-all-tags” på den nya filen innan man gör något ytterligare.
http://mywiki.wooledge.org/ParsingLsubot skrev:Jag kör kommandot ls -1 för att få en fin lista med filnamn.
Men det blir just så att varje ord blir ett element nu eftersom dina "-tecknen blir en del av själva strängen. Där du vill ha ett element foo bar kommer du att få två element, först "foo och sedan bar".ubot skrev:Däremot så ska sed 's/^/"/' och sed 's/$/"/' vara med för att omsluta filnamnen med "-tecken så att varje filnamn blir ett element i arrayn. Annars så finns risken att varje ord i filnamnen kommer att bli ett element.
Men du ersätter ju även tecken i själva filnamnen, inte bara mellan dem. Och bash klarar dessutom av att skapa arrayer med nyrader som elementavdelare:ubot skrev:Sista tr-kommandot gör att allt läggs på en rad så att slutresultatet blir: files=( "filnamn1" "filnamn2" "filnamn3" ... "filnamnX" ). Det har med hur bash hanterar arrays.
Kod: Markera allt
files=(
"filnamn1"
"filnamn2"
"filnamn3"
...
"filnamnX"
)
array_exempel3=( $(echo Hey Ho Lets Go | sed 's/^/"/' | sed 's/$/"/') ) är en array med 4 element och echo "${array_exempel3[0]}" ger "Hejubot skrev:array_exempel1=( Hey Ho Lets Go ) är en array med 4 element. echo "${array_exempel1[0]}" ger Hey.
array_exempel2=( "Hey Ho Lets Go" ) är en array med 1 element. echo "${array_exempel2[0]}" ger Hey Ho Lets Go.
Filnamn kan innehålla precis vilka tecken som helst utom / och nolltecken, och är det en fullständing sökväg så finns ju även / med. Men för att komma till hur du bör göra för att dina skript ska fungera oavsett vilka tecken som råkar finnas i filnamnen. Om du vill ha en array med filnamn så skapar du den så här:ubot skrev:Om du har filnamn som innehåller "-tecken så måste man lägga till sed 's/\"/\\"/g' direkt efter ls -1 $1 så att filnamnens "-tecken inte förväxlas med citationstecknen som omsluter resp. filnamn. Jag vet inte hur man löser filnamn med nyrad i. Går det att ha filnamn med nyrad i?
Kod: Markera allt
files=(/sökväg/*)
Kod: Markera allt
for file in /sökväg/*; do
Ok, tack för infon och länken. Jag har bara använt ls för att lista filer jag har skapat själv förut och då har jag haft full kontroll på namngivningen varför problemet aldrig har uppstått. Det är klart att man får hitta på en annan lösning eftersom skriptet inte ska fela bara för att filnamnet har ny rad osv. Det räcker med att loopa filerna direkt från sökvägen som du visade.Konservburk skrev:http://mywiki.wooledge.org/ParsingLsubot skrev:Jag kör kommandot ls -1 för att få en fin lista med filnamn.
Men det blir just så att varje ord blir ett element nu eftersom dina "-tecknen blir en del av själva strängen. Där du vill ha ett element foo bar kommer du att få två element, först "foo och sedan bar".ubot skrev:Däremot så ska sed 's/^/"/' och sed 's/$/"/' vara med för att omsluta filnamnen med "-tecken så att varje filnamn blir ett element i arrayn. Annars så finns risken att varje ord i filnamnen kommer att bli ett element.
Men du ersätter ju även tecken i själva filnamnen, inte bara mellan dem. Och bash klarar dessutom av att skapa arrayer med nyrader som elementavdelare:ubot skrev:Sista tr-kommandot gör att allt läggs på en rad så att slutresultatet blir: files=( "filnamn1" "filnamn2" "filnamn3" ... "filnamnX" ). Det har med hur bash hanterar arrays.
Kod: Markera allt
files=( "filnamn1" "filnamn2" "filnamn3" ... "filnamnX" )
array_exempel3=( $(echo Hey Ho Lets Go | sed 's/^/"/' | sed 's/$/"/') ) är en array med 4 element och echo "${array_exempel3[0]}" ger "Hejubot skrev:array_exempel1=( Hey Ho Lets Go ) är en array med 4 element. echo "${array_exempel1[0]}" ger Hey.
array_exempel2=( "Hey Ho Lets Go" ) är en array med 1 element. echo "${array_exempel2[0]}" ger Hey Ho Lets Go.
Filnamn kan innehålla precis vilka tecken som helst utom / och nolltecken, och är det en fullständing sökväg så finns ju även / med. Men för att komma till hur du bör göra för att dina skript ska fungera oavsett vilka tecken som råkar finnas i filnamnen. Om du vill ha en array med filnamn så skapar du den så här:ubot skrev:Om du har filnamn som innehåller "-tecken så måste man lägga till sed 's/\"/\\"/g' direkt efter ls -1 $1 så att filnamnens "-tecken inte förväxlas med citationstecknen som omsluter resp. filnamn. Jag vet inte hur man löser filnamn med nyrad i. Går det att ha filnamn med nyrad i?
Eller utan sökväg om du redan står i rätt katalog. Ska du bara ha en array med filnamn för att kunna loopa över filerna så behöver du egentligen ingen array till att börja med. Då räcker det att loopa direkt så här:Kod: Markera allt
files=(/sökväg/*)
Gör du på något av de här sätten så fungerar det oavsett vilka tecken som finns i filnamnen, men bara om du du har "-tecken runt variabeln när du använder den.Kod: Markera allt
for file in /sökväg/*; do
Kod: Markera allt
for file in "$path"*; do
Kod: Markera allt
#!/bin/bash
# Execute by: ./flacscript.sh "/home/username/Music/" "/path/to/new/files/"
# What is the path to the old files?
path=$(echo "$1" | sed 's/[^\/]$/&\//')
# What is the path to the new files?
newpath=$(echo "$2" | sed 's/[^\/]$/&\//')
# Loop each file one by one.
for file in "$path"*; do
# Date and time?
now=date-from-old-file
# Copy old file to new file. Add date and time to new file name.
cp $path$file $newpath$file-$now.flac
# Get all tags from old file.
tags=$(metaflac --list $path$file | grep -A 1000 "comment\[.*\]" | grep -B 1000 "comment\[.*\]" | sed 's/^[^\ ].*/\\x0A&/' | tr -d '\n' | sed 's/comment\[/\ncomment\[/g')
# How many comments are there?
comments=$(metaflac --list $path$file | grep "^\ *comment\[.*\]:" | wc -l)
# Loop through each comment one by one.
for (( i=0; i<$comments; i++ )); do
# Add a new tag to the new file.
metaflac --set-tag="$(echo "$tags" | grep "comment\[$i\]:" | sed "s/comment\[$i\]: //")" $newpath$file-$now.flac
# End of loop 2.
done
# End of loop 1.
done
Package: arename
State: not installed
Version: 3.1-1
Priority: optional
Section: universe/sound
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Uncompressed Size: 193k
Depends: perl, libreadonly-perl, libmp3-tag-perl, libogg-vorbis-header-perl, libaudio-flac-header-perl
Description: automatic audio file renaming
arename is a tool that is able to rename audio files by looking at a file's tagging information. It uses this information to
assemble a consistent destination file name. The user can define the format of the destination filename by the use of
template strings.
Homepage: http://ft.bewatermyfriend.org/comp/arename.html