我需要一个 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
)
答案1
好的,我明白 shell 脚本确实是一种强大的工具,但它确实很混乱:
我已经尝试过了第四眼 回答但是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 终端上测试了它并且它有另一个我从未听说过的 shell(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)
答案2
以下是我大致的做法。按正确顺序迭代目录,然后迭代文件。它假设没有高于的目录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