Я пишу сценарий оболочки для пакетной обработки файлов .mov с моей камеры через Ручной тормоз для экономии места на жестком диске. Сценарий выполняет поиск в каталоге с помощью команды «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