Сгладить каталог с приращением имен

Мне нужен скрипт bash для выравнивания каталога с такими же именами и получения упорядоченного вывода после преобразования.

структура входной папки:

/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

и мне нужен выходной каталог, подобный этому:

/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

где /out/file004.mp3 - это преобразование mp3 из /in2/file1.wav

[ 1110] Я провел несколько испытаний с find -exec, но не могу заставить его работать

(не беспокойтесь о конвертации, я просто использую ffmpeg -i fileinput fileoutput.mp3)

1
задан 18 September 2016 в 22:45

2 ответа

хорошо, я понимаю, что сценарии оболочки являются действительно электроинструментом, но это - реальная путаница:

я попробовал thefourtheye ответ, но sort команда испортила, все из-за порядка было похоже на это:

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

и пробелы были проблемой, таким образом, я должен был добавить " но была некоторая путаница также, я не помню точно, где, затем я пытался поместить некоторую печать отладки, и она не работала так... В конце я протестировал его на Mac OS/X терминал, и это имеет другую оболочку, которую я никогда не слышал о (zsh), который использует различные команды.. большая путаница.

Я придумал маленький сценарий Python. Возможно, это грязно, но это работает:

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)
1
ответ дан 18 September 2016 в 22:45

Вот примерно, как я сделал бы это. Выполните итерации каталогов в правильном порядке, затем файлы. Это предполагает, что нет никакого dir выше, чем in9/ и никакой файл выше, чем file99.wav . Если существуют, расширяют циклы соответственно. Например. 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
1
ответ дан 18 September 2016 в 22:45

Другие вопросы по тегам:

Похожие вопросы: