Gå til innhold

[Løst] Mislykket script


Anbefalte innlegg

Prøvde meg på mitt første script i dag, men det ikke ikke som forventet.

 

Formålet med scriptet er å kjøre en kommando for alle visse filer i en katalog.

 

 

Forslag1:

#!/bin/bash

FOLDER=${1}

for I in `find "${FOLDER}" -name "*.ape"`
do
 ffmpeg -i "${FOLDER}"/"${I}" -acodec flac "${FOLDER}"/"${I}".flac
done

exit

 

Forslag2:

cd "$1"
find -depth -print0 | while read -d \0' filename;
do
   filename="${filename##*/}"
   ffmpeg -i "${filename}" -acodec flac "${filename}".flac
done

exit

 

 

 

 

Noen som har en anelse hvorfor disse feilet?

 

Forslag1 bryter opp alle filnavnene i stykker

 

Forslag2 finner alle filene, men kjøringen går galt.

 

 

Endret av DJViking
Lenke til kommentar
Videoannonse
Annonse

Er vel ikke nødvendig å bruke find heller.

 

cd ${1}
for i in `ls *.ape`; do
   ...kode...
done

 

Vil den vente med neste løkke til etter kommandoen har kjørt?

 

 

Prøvde ut din løsning først ved å skrive ut filene

for i in `ls *.ape`; do
 echo "${FOLDER}"/"${i}"
 #ffmpeg -i "${FOLDER}"/"${i}" -acodec flac "${FOLDER}"/"${i}".flac
done

 

Den feiler på samme måte som mitt første forslag.

 

Utskriften av filnavnene blir slik

 

Beethoven

+

Karajan

-

08.

Symphony

no.

7

in

A

major,

op.92;

Allegro

con

brio.ape

 

 

 

Endret av DJViking
Lenke til kommentar

Kommer rundt problemet med et par ".

 

for i in "`ls *.ape`"; do

 

Det gikk. Hva er det med ; før do? Det virker med og uten den.

 

 

Tror jeg må sette meg ned å lese en script-bok.

 

 

 

 

Edit: Den prøver å kjøre kommandoen med alle filnavnene i èn parameter og ikke x antall ganger for x antall filer.

 

Ser ikke ut som for-løkken virker. Innholdet blir bare kjørt en gang og parameteren fra ls blir en eneste lang streng med alle filnavnene.

 

 

 

Endret av DJViking
Lenke til kommentar

Hm, ikke godt å si, jeg gjør sånn av gammel vane.

 

Står følgende her:

If do is on same line as for, there needs to be a semicolon after list.

 

Edit: det har du jaggu rett i. Hmm.

Jeg har snekret noe lignende for konvertering fra flac til mp3 før, skal grave frem og se hva jeg gjorde der.

Endret av Sokkalf™
Lenke til kommentar

Nå surrer jeg fælt her, men tror du var inne på noe i ditt alt. #2.

 

Hva med:

ls *.ape | while read filename; do
   ...kode...
done

?

 

Det går bedre, men resultatet er det samme som mitt forslag2.

 

 

Når den kjører ffmpeg så går den helt bananas og begynner å spytte ut masse HEX.

 

Et lite utdrag fra kjøringen:

 

Input #0, ape, from 'Beethoven + Karajan - 01. Symphony no. 2 in D major, op.36; Adagio - Allegro con brio - Symphony.ape':

Metadata:

Track : 1

Genre : Classical

Artist : Beethoven + Karajan

Album : Symphonies Nos. 2 & 7

Title : Symphony no. 2 in D major, op.36; Adagio - Allegro con brio - Symphony

Duration: 00:10:21.19, start: 0.000000, bitrate: 652 kb/s

Stream #0:0: Audio: ape (APE / 0x20455041), 44100 Hz, stereo, s16

Output #0, flac, to 'Beethoven + Karajan - 01. Symphony no. 2 in D major, op.36; Adagio - Allegro con brio - Symphony.ape.flac':

Metadata:

TRACKNUMBER : 1

Genre : Classical

Artist : Beethoven + Karajan

Album : Symphonies Nos. 2 & 7

Title : Symphony no. 2 in D major, op.36; Adagio - Allegro con brio - Symphony

encoder : Lavf53.18.0

Stream #0:0: Audio: flac, 44100 Hz, stereo, s16, 128 kb/s

Stream mapping:

Stream #0.0 -> #0.0

Press [q] to stop, [?] for help

Multiple frames in a packet from stream 0

stream #0:

keyframe=1

duration=0.104

dts=6.687 pts=6.687

size=122672

stream #0:

keyframe=1

duration=0.104

dts=8.359 pts=8.359

size=89612

stream #0:

keyframe=1

duration=0.104

dts=10.031 pts=10.031

size=89180

...

Multiple frames in a packet from stream 0

Multiple frames in a packet from stream 0

Multiple frames in a packet from stream 0

Multiple frames in a packet from stream 0

Multiple frames in a packet from stream 0

Multiple frames in a packet from stream 0

Multiple frames in a packet from stream 0

Multiple frames in a packet from stream 0

Multiple frames in a packet from stream 0

Multiple frames in a packet from stream 0

Multiple frames in a packet from stream 0

Multiple frames in a packet from stream 0

Multiple frames in a packet from stream 0

Multiple frames in a packet from stream 0

Multiple frames in a packet from stream 0

stream #0:

keyframe=1

duration=0.104

dts=30.093 pts=30.093

size=124836

...

stream #0:

keyframe=1

duration=0.104

dts=50.155 pts=50.155

size=98404

00000000 00 20 01 00 00 00 00 00 c3 e2 f8 59 1a 45 14 00 . .........Y.E..

00000010 d0 11 df 2e 78 6a e9 1a 5f 91 03 9e 36 8d ed 37 ....xj.._...6..7

00000020 08 e3 f0 2a f3 76 47 39 7a b7 26 35 76 46 55 ee ...*.vG9z.&5vFU.

00000030 4d ae 53 a3 3f 80 db 6a f1 f1 1c 27 2b 14 e2 2b M.S.?..j...'+..+

00000040 73 54 7c ee d4 e7 9e 06 41 54 13 3b ff 2a 5d f0 sT|.....AT.;.*].

 

 

 

 

 

 

Slik skal det være når jeg kjører manuelt:

 

 

Input #0, ape, from 'Beethoven + Karajan - 01. Symphony no. 2 in D major, op.36; Adagio - Allegro con brio - Symphony.ape':

Metadata:

Track : 1

Genre : Classical

Artist : Beethoven + Karajan

Album : Symphonies Nos. 2 & 7

Title : Symphony no. 2 in D major, op.36; Adagio - Allegro con brio - Symphony

Duration: 00:10:21.19, start: 0.000000, bitrate: 652 kb/s

Stream #0:0: Audio: ape (APE / 0x20455041), 44100 Hz, stereo, s16

Output #0, flac, to 'Beethoven + Karajan - 01. Symphony no. 2 in D major, op.36; Adagio - Allegro con brio - Symphony.flac':

Metadata:

TRACKNUMBER : 1

Genre : Classical

Artist : Beethoven + Karajan

Album : Symphonies Nos. 2 & 7

Title : Symphony no. 2 in D major, op.36; Adagio - Allegro con brio - Symphony

encoder : Lavf53.18.0

Stream #0:0: Audio: flac, 44100 Hz, stereo, s16, 128 kb/s

Stream mapping:

Stream #0.0 -> #0.0

Press [q] to stop, [?] for help

Multiple frames in a packet from stream 0

size= 50897kB time=00:10:21.29 bitrate= 671.1kbits/s

video:0kB audio:50889kB global headers:0kB muxing overhead 0.016173%

 

 

Endret av DJViking
Lenke til kommentar

find . -name "*.ape" --exec echo File is '{}' some more text ';'

 

for i in $(find workspace -name "*.xml"); do echo File $i; done

 

Følgende ville ikke kjøre:

 

find . -name "*.ape" -exec echo File is '{}' some more text ';'
for i in $(find workspace -name "*.xml"); do echo File $i; done

 

Tilpasset denne til følgende og det virket fint.

find . -name "*.ape" -exec ffmpeg -i '{}' -acodec flac '{}'.flac ';'

 

 

 

Funker ffmpeg hvis du kjører tilsvarende kommando i shellet med filnavnene fylt ut manuelt, da?

Det virker ja.

Endret av DJViking
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...