Сценарий оболочки при цикле чтения выполняется только один раз

Я пишу сценарий оболочки для пакетной обработки файлов .mov с моей камеры через Handbrake , чтобы сэкономить место HD. Сценарий ищет каталог с помощью 'find', а затем запускает Handbrake для каждого найденного файла .mov, сопоставляя дату создания результирующего файла с датой исходного файла с помощью 'touch'.

Первоначально я сделал это с помощью для цикла :

for i in $(find "$*" -iname '*.mov') ; do
  ~/Unix/HandbrakeCLI --input "$i" --output "$i".mp4 --preset="Normal"
  touch -r "$i" "$i".mp4
done

Это сработало, но не удалось, если во входных файлах были пробелы в именах файлов. Поэтому я попробовал вместо этого цикл while :

find "$*" -iname '*.mov' | while read i ; do
  ~/Unix/HandbrakeCLI --input "$i" --output "$i".mp4 --preset="Normal"
  touch -r "$i" "$i".mp4
done

Проблема с этим циклом в том, что он работает для первого файла в каталоге, а затем выходит из цикла. Обратите внимание, что если я заменяю «echo $ i» в теле цикла while, он распечатывает все файлы .mov в каталоге, поэтому цикл имеет правильную структуру.

Я считаю, что есть частичный ответ на мой вопрос по потоку переполнения стека . Но решение специфично для ssh и не решает общей проблемы. Кажется, что-то связано с тем, что stdin используется подпроцессом, но я не совсем понимаю, как это работает.

Есть совет?

Я использую OSX 10.6

8
задан Community 23 May 2017 в 12:16
поделиться