Мне нужен скрипт 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
find -exec
, но не могу заставить его работать
(не беспокойтесь о конвертации, я просто использую ffmpeg -i fileinput fileoutput.mp3
)
хорошо, я понимаю, что сценарии оболочки являются действительно электроинструментом, но это - реальная путаница:
я попробовал 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)
Вот примерно, как я сделал бы это. Выполните итерации каталогов в правильном порядке, затем файлы. Это предполагает, что нет никакого 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