如何按字母顺序合并bash中的文件

时间:2011-08-24 13:52:13

标签: bash ls cat

我需要将一堆mp3文件合并在一起。我知道只是在做

cat file1.mp3 >> file2.mp3

似乎工作正常(至少它在我的Zune上正确播放)。

我想跑

cat *.mp3 > merged.mp3

但是因为有大约50个单独的mp3文件,所以我不想在错误的位置找到一个文件中途(这是一本我不想重新翻录的音频书)。

我通读了cat手册页,但无法找到是否定义了通配符运算符的顺序。

如果cat不起作用,是否有一种简单的方法(可能使用lsxargs)可以为我做到这一点?

2 个答案:

答案 0 :(得分:13)

您的版本(cat *.mp3 > merged.mp3)应该按照您的预期运行。 *.mp3由shell扩展,并按字母顺序排列。

来自Bash Reference Manual

  

分词后,除非设置了-f选项,否则Bash会扫描每个单词中的字符'*','?'和'['。如果出现其中一个字符,则该单词将被视为模式,将替换为与该模式匹配的按字母顺序排列的文件名列表

但是,请注意,如果您有许多文件(或长文件名),则会受到“argument list too long”错误的阻碍。

如果发生这种情况,请改用find

find . -name "*.mp3" -maxdepth 0 -print0 | sort -z | xargs -0 cat > merged.mp3

-print0中的find选项使用空字符作为字段分隔符(正确处理带空格的文件名,与MP3文件一样),而-z位于sort {}}中的{}和-0通知替代分隔符的程序。

奖励功能:省略xargs也包含子目录中的文件。


然而,合并MP3文件的方法会弄乱诸如ID3标题和持续时间信息之类的信息。这会影响更多挑剔玩家的可玩性,比如iTunes(也许?)。

要正确执行此操作,请参阅“A better way to losslessly join MP3 files”或“What is the best way to merge mp3 files?

答案 1 :(得分:4)

尝试:

ls | sort | xargs cat > merged.mp3

(无论如何我不确定你能以这种方式合并mp3文件)

相关问题