2016-07-22 90 views
0

我有一系列包含多个mp3文件的目录,文件名为001.mp3,002.mp3,...,030.mp3。在执行命令之前排序find的输出-exec

我想要做的就是把它们放在一起整理成一个mp3文件并添加一些元数据。

这就是我目前所面对的(除去一些变量定义,为清楚起见):

#!/bin/bash 
for d in */; do 
    cd $d 
    find . -iname '*.mp3' -exec lame --decode '{}' - ';' | lame --tt "$title_prefix$name" --ty "${name:5}" --ta "$artist" --tl "$album" -b 64 - $final_path"${d%/}".mp3 
    cd .. 
done 

有时候这工作,我也得到以正确的顺序所有的“轨道”的单个文件。

但是,更多的时候,我会以相反的顺序得到一个包含所有“曲目”的单个文件,这实际上并不好。

我不明白的是,为什么顺序在脚本的不同运行之间变化,因为所有目录都包含相同的一组文件名。我倒过了手册页,找不到排序选项。

我可以运行find . -iname '*.mp3' | sort -n >> temp.txt将文件放到一个临时文件中,然后尝试循环,但我无法得到与跛脚一起工作。

有没有什么办法可以在找到之前进行排序运行exec?我可以通过-exec ls在这里和其他地方找到大量的例子,但不是在那里需要执行exec更复杂的事情。

+0

在这里推动我自己的bash能力的边界,但我可以做些什么,比如'find。 -iname'* .mp3'| sort -n | xargs '?如果是的话,我将如何重新安排lame命令来进行输入? – yknivag

+0

temp.txt包含完整路径还是只包含一系列文件名? –

+0

如果可能,我宁愿不使用临时文件。但它可能被构造为包含任何类型的文件名。 – yknivag

回答

1
find . -iname '*.mp3' -print0 | sort -zn | xargs -0 -I '{}' lame --decode '{}' - | lame --tt "$title_prefix$name" --ty "${name:5}" --ta "$artist" --tl "$album" -b 64 - $final_path"${d%/}".mp3 

未经测试,但可能值得一试。

通常,xargs将参数追加到您给它的命令的末尾。 -I选项告诉它替换给定的字符串(在这种情况下为{})。


编辑:我已经添加-print0-z-0,以确保管道仍然有效,即使你的文件名包含换行符。

+0

将'sort -n'改为'sort -zn',因为默认排序返回换行符分隔的记录 – oakymax

+0

我不能建议编辑 - 至少应该添加6个符号)) – oakymax

+0

@melpomene谢谢!这工作完美。 – yknivag

相关问题