запустить команду exec () столько раз, сколько строк в текстовом файле

0

Я использую библиотеку Sox (Sound eXchange) для преобразования WAV файла в.flac. Если я использую терминал, он работает хорошо:

$Brus:~ pum$ sox outputFolder/file/file.000.wav flac/file.000.flac

и файл file.000.flac был правильно преобразован в папку flac.

Также внутри моего скрипта, если я запускаю:

         exec('sox/sox outputFolder/file/file.000.wav flac/file.000.flac');

конверсия работает хорошо.

Моя проблема сейчас в том, что мне нужно преобразовать пакет файлов. Я создаю txt файл со списком файлов.wav(listWav.txt), которые нужно преобразовать, и я хочу запустить команду "exec()" столько раз, сколько строк с именем файла в "listWav.txt" " файл.

Это файл listWav.txt:

outputFiles/file/file.000.wav
outputFiles/file/file.001.wav

Это файл listFlac.txt:

file.000.flac
file.001.flac

Это код, который я написал, пытаясь запустить команду "exec()", как описано:

//read all txt files content
$file2 = fopen("listFlac.txt","r");
$file3 = fopen("listWav.txt", "r");
//loop the file and read it line by line
while(! feof($file2) && ! feof($file3)){
  $tt = fgets($file2);
  $tt2 = fgets($file3);
  //run sox conversion
  exec('sox/sox' . ' ' . $tt2 . ' ' . 'flac/' . $tt);
}
fclose($file2);
fclose($file3);

Если я print_r ('sox/sox'. ''. $ Tt2. ''. 'Flac/'. $ Tt); это результат:

sox/sox outputFiles/file/file.000.wav flac/file.000.flac sox/sox outputFiles/file/file.001.wav flac/file.001.flac

поэтому цикл команды "exec()" выполнялся столько раз, сколько строки файла "listWav.txt", но он не работает должным образом, потому что генерируется только "file.001.flac", поэтому я понимаю что цикл while позволяет "exec()" принимать только конечную строку файла "listWav.txt" и запускать его.

Кто-нибудь знает, что мне нужно изменить в моем скрипте, чтобы запустить "exec()" количество раз для всех файлов в списке?

EDIT: Я решил таким образом, я разделил время на два в то время как вложенные и назвал две эквивалентные команды "exec()". Код может быть не изящным, но он работает для моей цели.

while(! feof($file2)){
  $tt = fgets($file2);
    while (!feof($file3)) {
      $tt2 = fgets($file3);
      exec('sox/sox' . ' ' . $tt2 . ' ' . 'flac/' . $tt);  
    }
      exec('sox/sox' . ' ' . $tt2 . ' ' . 'flac/' . $tt); 
}
Теги:
batch-processing
sox

1 ответ

1

вместо этого используйте функцию file и добавьте счетчик к вашему циклу.

$flacArray = file("listFlac.txt");
$wawArray = file("listWav.txt");
$i=0;
foreach ($flacArray as $flac) {
    $wavInfo = pathinfo($wawArray[$i]);
    exec('sox/sox' . ' ' . $flac . ' ' . 'flac/' .  $wavInfo["basename"] . str_pad($i, 3, "0", STR_PAD_LEFT) .".wav");
    $i++;
}

ПРИМЕЧАНИЕ. Это работает только для файла 999.

  • 0
    Спасибо за ответ, я буду использовать ваш код в другой части моего проекта. О своем вопросе я решил сам и выложил решение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню