Diretório flatten com nomes incrementados

1

Eu preciso de um script bash para achatar um diretório com os mesmos nomes e obter uma saída ordenada após uma conversão.

estrutura da pasta de entrada:

/in1/file1.wav
/in1/file2.wav
/in1/file3.wav

/in2/file1.wav
/in2/file2.wav
/in2/file3.wav
/in2/file4.wav

/in3/file1.wav
/in3/file2.wav

e eu preciso de um diretório de saída como este:

/out/file0001.mp3
/out/file0002.mp3
/out/file0003.mp3
/out/file0004.mp3
/out/file0005.mp3
/out/file0006.mp3
/out/file0007.mp3
/out/file0008.mp3
/out/file0009.mp3

onde /out/file004.mp3 é a conversão de mp3 de /in2/file1.wav

Eu fiz algumas tentativas com find -exec , mas não consigo fazer isso funcionar

(não se preocupe com conversão, eu só uso ffmpeg -i fileinput fileoutput.mp3 )

    
por nkint 05.05.2013 / 14:16

2 respostas

1

ok, eu entendo que o shell script é realmente uma ferramenta poderosa, mas é uma verdadeira bagunça:

Eu tentei com thefourtheye answer mas o comando sort bagunçou tudo porque a ordem era assim:

Sequence 1.wav
Sequence 10.wav
Sequence 11.wav
Sequence 12.wav
Sequence 2.wav
Sequence 3.wav
Sequence 4.wav
...

e os espaços foi um problema, então eu tive que adicionar " , mas houve alguma confusão também não me lembro exatamente onde, então eu tentei colocar alguma impressão de depuração e não funcionou assim ... No final, eu testei em um terminal Mac OS / X e tem outro shell que eu nunca ouvi falar (zsh) que usa comandos diferentes .. uma grande bagunça.

Eu criei um pequeno script python. Talvez esteja sujo, mas funciona:

import os, sys

count = 1
for dirpath, diname, filenames in os.walk('.'):

    if dirpath=='.' or dirpath=='./out':
        continue

    filenames = [f for f in filenames if f.split('.')[1]=='aif' and f[0]!='.']
    filenames = sorted(filenames, key=lambda f: int(f.split('.')[0].split(' ')[1]))

    for f in filenames:
        filepath = dirpath+'/'+f
        ffmpeg_command = 'ffmpeg -i "'+filepath+'" out/track'+"%04d" % (count,)+'.mp3'
        count += 1
        print ffmpeg_command
        os.system(ffmpeg_command)
    
por nkint 07.05.2013 / 12:54
1

Aqui está mais ou menos como eu faria isso. Iterar os diretórios na ordem correta e, em seguida, os arquivos. Ele supõe que não há nenhum diretório maior que in9/ e nenhum arquivo maior que file99.wav . Se houver, estenda os loops de acordo. Por exemplo. for dir in in[0-9]/ in[1-9][0-9]/; do

#!/bin/bash
i=0
for dir in in[0-9]/; do
    for file in "$dir"/file[0-9].wav "$dir"/file[1-9][0-9].wav; do
        printf -v dest 'out/file%04d.mp3' "$((++i))"
        ffmpeg -i "$file" "$dest"
    done
done
    
por geirha 07.05.2013 / 13:57