В BSD netstat
-p
является протоколом, тогда как это программа в netstat
из net-tools, версия BSD, похоже, не имеет эквивалента. мужчина
почти всегда ваш друг в таких случаях.
BSD имеет sockstat
, который дает вам то, что вы хотите, но его, похоже, нет в OS X, к которой у меня есть доступ.
Как уже упоминалось, lsof
, вероятно, является наиболее кроссплатформенным способом получения желаемого результата. добавьте -n
, чтобы номера портов не преобразовывались в имена и не вводили вас в заблуждение ndl-aas , где вы ожидаете 3128.
Dada una matriz arr3 que contiene datos de muestra:
declare -a arr3=([0]="00:00:22.180 --> 00:00:25.600"
[1]="00:00:24.070 --> 00:00:27.790")
Puede recorrer cada elemento de la matriz, eliminar la hora de inicio y la hora de finalización, convertirlos en fracciones de segundo, calcular la duración y luego convertir esa duración de nuevo al formato hh :mm :ss.sss para el comando ffmpeg.
# converts HH:MM:SS.sss to fractional seconds
codes2seconds() (
local hh=${1%%:*}
local rest=${1#*:}
local mm=${rest%%:*}
local ss=${rest#*:}
printf "%s" $(bc <<< "$hh * 60 * 60 + $mm * 60 + $ss")
)
# converts fractional seconds to HH:MM:SS.sss
seconds2codes() (
local seconds=$1
local hh=$(bc <<< "scale=0; $seconds / 3600")
local remainder=$(bc <<< "$seconds % 3600")
local mm=$(bc <<< "scale=0; $remainder / 60")
local ss=$(bc <<< "$remainder % 60")
printf "%02d:%02d:%06.3f" "$hh" "$mm" "$ss"
)
subtracttimes() (
local t1sec=$(codes2seconds "$1")
local t2sec=$(codes2seconds "$2")
printf "%s" $(bc <<< "$t2sec - $t1sec")
)
declare -a arr3=([0]="00:00:22.180 --> 00:00:25.600"
[1]="00:00:24.070 --> 00:00:27.790")
for range in "${arr3[@]}"
do
duration=$(subtracttimes "${range%% -->*}" "${range##*--> }")
printf "%s\n" "ffmpeg -i movie.mp4 -ss ${range%% -->*} -t $duration -async 1 cut.mp4"
done
La función codes2seconds
espera entrada en formato HH :MM :SS.sss;elimina los diversos elementos mediante la expansión de parámetros y luego los pasa a bc
para la conversión en número total de segundos.
La función seconds2codes
espera una fracción de segundos e invierte la conversión, lo que da como resultado una cadena HH :MM :SS.sss.
La función subtracttimes
convierte los dos parámetros en fracciones de segundo y luego pregunta a bc
cuál es la diferencia.
El bucle al final pasa por cada elemento de arr3; utiliza las funciones anteriores para calcular la duración (nuevamente usando la expansión de parámetros para recuperar los dos tiempos )y luego imprime una llamada de muestra ffmpeg
para que coincida con su salida de muestra.
Resultados:
ffmpeg -i movie.mp4 -ss 00:00:22.180 -t 3.420 -async 1 cut.mp4
ffmpeg -i movie.mp4 -ss 00:00:24.070 -t 3.720 -async 1 cut.mp4
Bueno, para los códigos de tiempo date
por lo general aparece en mi mente. No es el guión más elegante, pero hace el trabajo...
Asumo por su pregunta que ya ha leído las horas de inicio y finalización en las respectivas matrices y utilizará start
y end
como estos valores aquí y lo hará paso a paso:
#!/bin/bash
start=00:00:22.180
end=00:00:24.070
#convert timestamps to epoch time in nano seconds
start_ns="$(date -u -d"$start" +%s%N)"
end_ns="$(date -u -d"$end" +%s%N)"
difference="$(($end_ns-$start_ns))"
#date does not read epoch time in nanoseconds,
#so it must be converted by division vith 10^9 before display
#date_diff is accurate up to full seconds
#use UTC time (-u) to avoid problems with time zones
date_diff="$( date -u -d@$((difference/1000000000)) +%H:%M:%S )"
#take care of milliseconds as remainder of division by 10^9 and correction by 10^6
ms_diff="$(( $difference%1000000000/1000000 ))"
#combine output to create desired format
echo "$date_diff"."$ms_diff"
Resultado
bash script.sh
00:00:01.890
Todo en una línea
echo "$(date -u -d@"$(( ($(date -u -d"$end" +%s%N) - $(date -u -d"$start" +%s%N))/1000000000 ))" +%H:%M:%S)"."$(( ($(date -u -d"$end" +%s%N) - $(date -u -d"$start" +%s%N))%1000000000/1000000 ))"
Tenga en cuenta que no sé si el tiempo de nanosegundos en date
es una característica estándar de POSIX.