Я пишу сценарий оболочки для пакетной обработки файлов .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