Как объединить файлы в bash в алфавитном порядке


Мне нужно объединить кучу mp3-файлов вместе. Я знаю, что просто делаю

cat file1.mp3 >> file2.mp3

, кажется, работает нормально (по крайней мере, он воспроизводит правильно на моем Zune в любом случае).

Я хотел бы бежать

cat *.mp3 > merged.mp3
Но поскольку существует около 50 отдельных mp3-файлов, я не хочу быть удивленным на полпути к файлу в неправильном месте (это аудиокнига, которую я не хочу повторно разрывать).

Я прочитал страницы cat man и не смог найти, соответствует ли порядок подстановочных знаков оператор определен.

Если cat не работает для этого, есть ли простой способ (возможно, используя ls и xargs), который мог бы сделать это для меня?

2 7

2 ответа:

Ваша версия (cat *.mp3 > merged.mp3) должна работать так, как вы ожидаете. *.mp3 расширяется оболочкой и будет располагаться в алфавитном порядке.

Из справочника Bash :

После разделения слов, если не установлен параметр-f, Bash сканирует каждое слово на наличие символов"*","?’, и ‘[’. Если один из этих символов появляется, то слово рассматривается как шаблон, и заменяется алфавитно отсортированным списком имен файлов , соответствующих шаблон.

Однако имейте в виду, что если у вас много файлов (или длинные имена файлов), вам будет мешать ошибка "список аргументов слишком длинный".

Если это произойдет, используйте find вместо:

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

Опция -print0 в find использует нулевой символ в качестве разделителей полей (для правильной обработки имен файлов с пробелами, как это обычно бывает с MP3-файлами), в то время как -z в sort и -0 в xargs информирует программы об альтернативном разделителе.

бонус особенность: оставьте -maxdepth 0, чтобы также включать файлы в подкаталоги.


Однако этот метод слияния MP3-файлов приведет к искажению такой информации, как заголовки ID3 и информация о продолжительности. Это повлияет на воспроизводимость на более придирчивых плеерах, таких как iTunes (возможно?).

Чтобы сделать это правильно, см. " Лучший способ без потерь объединить MP3-файлы" или " какой лучший способ объединить mp3-файлы? "

Попробуйте:

ls | sort | xargs cat > merged.mp3

(в любом случае я не уверен, что вы можете объединить mp3-файлы таким образом)