使用递增名称展平目录

使用递增名称展平目录

我需要一个 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.mp3mp3 转换在哪里/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

相关内容