Использование вложенных циклов while для обработки ffmpeg

Нет, они оба разные.
~(тильда):Представляет домашний каталог текущего активного пользователя, например:
Предположим, у меня есть две учетные записи пользователей, то есть root, sam.
при входе в систему как root вывод echo ~будет /root.
при входе в систему как sam вывод echo ~будет /home/sam.

cd(изменить каталог)
Это команда, используемая для изменения текущего каталога, где она принимает путь в качестве аргумента и меняет каталог в соответствии с этим, например:
cd /home/sam/Desktop/
Он изменит текущий каталог на рабочий стол пользователя.

Но когда мы набираем только cd, происходит переход в домашний каталог.
Когда аргументы не указаны, он возвращает вас в каталог, в который вы вошли.

1
05.08.2019, 20:34
2 ответа

Обходя точную команду, я полагаю, вы хотите что-то вроде этого (с очевидным вводом четырех -строк )?

$ bash looploop.sh 
run ffmpeg with arguments 'alpha' and 'beta'
run ffmpeg with arguments 'alpha' and 'charlie'
run ffmpeg with arguments 'alpha' and 'delta'
run ffmpeg with arguments 'beta' and 'charlie'
run ffmpeg with arguments 'beta' and 'delta'
run ffmpeg with arguments 'charlie' and 'delta'

Мы уже знаем, как сделать цикл, так что давайте просто добавим еще один, вложенный в первый. Это само по себе сопоставило бы все входные строки с собой и со всеми парами дважды, поэтому посчитайте строки, чтобы пропустить пары, которые уже будут обработаны.

#!/bin/bash

i=0
while IFS= read a; do 
        i=$((i + 1))
        j=0
        while IFS= read b; do
                j=$((j + 1))
                if [ "$j" -le "$i" ]; then continue; fi

                # insert the actual commands here
                printf "run ffmpeg with arguments '%s' and '%s'\n" "$a" "$b"
        done < vids.list
done < vids.list

Или, как вы сделали, удаляя строки по мере их обработки внешним циклом, это на самом деле короче:

#!/bin/bash
cp vids.list vids.list.tmp
while IFS= read a; do 
        while IFS= read b; do
                if [ "$a" = "$b" ]; then continue; fi
                # insert the actual commands here
                printf "run ffmpeg with arguments '%s' and '%s'\n" "$a" "$b"
        done < vids.list.tmp
        sed -i '1d' vids.list.tmp
done < vids.list.tmp
rm vids.list.tmp

Я не уверен, что именно вызывает «слишком много аргументов» в вашем скрипте, но аргументом для -iявляется строка в двойных -кавычках с подстановкой команд внутри, поэтому она будет передана как одиночный аргумент дляffmpeg(с новыми строками из echoвстроенного ). Это не должно приводить к слишком большому количеству аргументов.

1
27.01.2020, 23:41

А как насчет этого:

readarray -t arr < file
counter=1
for i in "${arr[@]}"; do 
  for k in "${!arr[@]}"; do 
    if [[ ! -z "${arr[$k+$counter]}" ]]; then 
      f1="${i}"
      f2="${arr[$k+$counter]}"
      ffmpeg -hide_banner -nostats -i "${f1}" -i "${f2}" -filter_complex signature=detectmode=full:nb_inputs=2 -f null - < /dev/null
    else
      break
    fi
  done
  (( counter++ ))
done
1
27.01.2020, 23:41

Теги

Похожие вопросы