Сценарий оболочки - Два для циклов и изменение расширения файла - PullRequest
0 голосов
/ 14 марта 2009

У меня есть этот сценарий Shell, и мне удалось его испортить, и я надеялся, что меня можно исправить и поставить на правильный путь, и, надеюсь, добавить несколько вещей, которые я недостаточно компетентен, чтобы делать сам. Я поместил то, что я хочу сделать, как комментарии в сценарии Shell ниже.

#!/bin/bash
#Get all files from dir "videos" and send to processLine function one at a time
cd /home/test/videos/
for file in `dir -d *` ; do
processLine -f $file
done

processLine(){
# I was hoping to have a further for loop that would loop 4 times and change the $ext
#variable to avi, mpg, wmv and mov
#For loop, execute a command on each file
for i in 1 2 3 4 5 6 7 8 9 10
do
START=$(date +%s.%N)
echo "$line"
#The saved file in done dir should have filename as $file + START.
eval "ffmpeg -i $file -ar 44100 /home/test/videos/done/$fileSTART.$ext" > /dev/null 2>&1

END=$(date +%s.%N)
DIFF=$(echo "$END - $START" | bc)

echo "$line, $START, $END, $DIFF" >> file.csv 2>&1
echo "It took $DIFF seconds"
echo $line
done
}

Основная идея сценария заключается в следующем: получить все файлы из каталога dir и запустить для них команду ffmpeg и посмотреть, сколько времени это займет. Я пытаюсь собрать статистику

Спасибо за любую помощь

Обновление

Использование сценария Джулиано и замена для циклов 2 и 3. Мне удалось получить следующий вывод:

.
.
.
/home/test/videos/done 8 mov took 0.012 seconds
/home/test/videos/done 9 mov took 0.012 seconds
/home/test/videos/video1236104961.flv 0 avi took 0.446 seconds

Там останавливается.

Ответы [ 3 ]

3 голосов
/ 15 марта 2009

Многое не так.

  1. Не используйте dir или ls для циклов.
  2. Почему Eval? Что вы ожидали получить?
  3. Вы используете $ line без определения.
  4. Не используйте bc для математики, так как bash уже оснащен для этого.
  5. Не используйте дату для измерения времени, bash уже предоставляет команду для этого.
  6. Что такое "-f" передается процессу LineLine ()?

Еще одна попытка, устраняющая некоторые проблемы:

#!/bin/bash
TIMEFORMAT=%6R
for file in /home/test/videos/* ; do
  if [ ! -f "$file" ]; then
    continue   # anything that is not a regular file
  fi
  for ext in avi mpg wmv mov; do
    for (( i = 0; i < 10; i++ )); do
      base="${file##*/}"
      elapsed=$({ time ffmpeg -i "$file" -ar 44100 -y "${file%/*}/done/${base%.*}-$i.$ext" &>/dev/null; } 2>&1)
      echo "$file $ext $i took $elapsed seconds"
    done
  done
done
0 голосов
/ 15 марта 2009

Я чувствую запах ловушки.

$ touch aaa
$ touch "bbb ccc"
$ ls -1
aaa
bbb ccc
$ for file in `dir -d *`; do echo $file; done
aaa
bbb\
ccc
0 голосов
/ 14 марта 2009

1) Где определяется $line?

2) Вы когда-нибудь использовали $i?

3) Вы можете зацикливать добавочные номера с помощью

for ext in avi mov mpg wmv; do
    ffmpg ...
done

4) Вы можете выполнять основную арифметику в bash с двойными паренами. Так что $(($x-$y)) вместо того, чтобы пускать до н.э.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...