Come faccio ad aggiungere un gruppo di file wav mantenendo l'ordinazione numbersca (non zero-imbottita)?

Ho molti (7500) file wav (chiamati dai loro numbers) che vorrei fondere in uno. Penso che deve essere fatto con un ciclo bash, poiché con l'utilizzo di globbing alcuni file sarebbero nell'ordine sbagliato (come 1111 prima del 2).

Qual è il modo migliore per farlo in Linux?

Se tutti i file hanno gli stessi parametri, ad esempio la frequenza di campionamento e il numero di canali, non puoi ancora semplicemente trascinarli. Devi togliere l'intestazione WAV.

Può essere più facile utilizzare un'utilità di manipolazione di file audio come il sox , che contiene un metodo per la catenazione dei file. Di fatto, lo fa per impostazione predefinita. Ad esempio, per combinare tre file wav in uno lungo:

 $ sox short1.wav short2.wav short3.wav long.wav 

Un loop non organizzerà i file nell'ordine desiderato. Quello che volete è ordinare i nomi, ma trattarli numberscamente. sort -n farà questo.

Così:

 $ sox $(ls *.wav | sort -n) out.wav 

Se il sox non riesce a gestire molti file, possiamo rompere il lavoro come questo:

 $ ls *.wav | sort -n > script 

Poi abbiamo un file di script che sembra:

 1.wav 2.wav ... 3999.wav 4000.wav ... file7500.wav 

Modifichiamo questo per rendere diverse linee di command:

 # catenate about half the files to temp1.wav sox \ 1.wav \ 2.wav \ ... \ 3999.wav \ temp1.wav # catenate the remainder to temp2.wav sox \ 4000.wav \ ... \ 7500.wav \ temp2.wav # catenate the two halves sox temp1.wav temp2.wav out.wav ; rm temp1.wav temp2.wav 

Come primo passo di modifica nell'elenco dei file, è ansible utilizzare il command vi :%s/.*/& \\/ per aggiungere un backslash dopo each row.