Получить обзор всех устройств (в этом примере :/dev/video0):
v4l2-ctl --list-devices
Проверьте доступные форматы:
v4l2-ctl --list-formats-ext -d /dev/video0
Определить источник звука (карта:0 ..., устройство:1 ... равно hw:0,1 . В этом примере hw :0,0):
arecord -l
Запись видео + аудио прямо в файл:
cvlc v4l2:///dev/video0:width=640:height=480 :input-slave=alsa://hw:0,0 --sout="#transcode{vcodec=theo,vb=2000,fps=20,scale=1.0,acodec=vorb,ab=90,channels=1,samplerate=44100}:standard{access=file,mux=ogg,dst=output.ogg}"
То же, но с живым видео:
cvlc v4l2:///dev/video0:width=640:height=480 :input-slave=alsa://hw:0,0 --sout="#transcode{vcodec=theo,vb=2000,fps=20,scale=1.0,acodec=vorb,ab=90,channels=1,samplerate=44100}:duplicate{dst=display,dst=standard{access=file,mux=ogg,dst=output.ogg}}"
Вы можете изменить cvlc
обратно на vlc
, если хотите иметь элементы управления + меню.
Если вы действительно не можете перейти на более разумную оболочку, то в csh
вы можете использовать модификатор :s
для замены строк внутри переменных
Пр.
#!/bin/csh -f
foreach file ( *.dat )
echo xy2sac $file $file:s/disp_post_mij_conv0000//:s/.dat/.sac/
end
Удалите echo
, если вы уверены, что имена файлов правильные
Предложение :использовать awk для простого сокращения " _" и "." и легко получить доступ к частям, которые вы хотите создать с новым именем файла, с помощью
Если вы уверены, что все *файлы.dat имеют именно ту структуру, которую вы упомянули (, т. е. в них нет пробелов,всегда 6 '_'и только 1 '.' и т. д.):
# solution with awk, which can easily define fields using a regex
# (here: "[_.]" so that either 1 "_" or 1 "." separates one field from the next)
# awk will check we presented a filename with the correct number of fields, and also
cd /correct/directory || exit 1 # ie, go to the right directory containing your.dat files, or exit
find./ -name '*.dat' -print \
| awk -F'[_.]' -v nbfield=8 '
( NF != nbfield ) {
print "Error: file " $0 " ignored: does not have the right structure." ;
next;
}
( NF == nbfield ) {
print "converting file: " $0 "..."
system("echo _remove_echo_when_ok_ xy2sac " $0 " " $1"_"$2"__"$(NF-1)".sac && echo OK || echo ___ko___ ")
}
'
И, конечно же, если вы считаете, что он работает правильно, :замените "echo _remove_echo_when_ok_ xy2sac "
(, который только отображает, но не выполняет xy2sac )на "xy2sac "
(, который его выполнит)
Внимание :Я не знал, что вы используете csh, поэтому мой ответ относится только к bash. Если это не вариант, другие ответы предоставляют полезные решения.
Вы можете использовать оператор =~
вместе с массивом BASH_REMATCH
для сопоставления частей имени файла и объединения их в новое имя файла:
#!/bin/bash
for file in *.dat
do
if [[ $file =~ ([A-Z]+_[A-Z]+_).*(..)\.dat ]]
then
xy2sac $file ${BASH_REMATCH[1]}${BASH_REMATCH[2]}.dac
fi
done
Кстати, вы должны убедиться, что ваши требования и пример совпадают, чтобы нам не пришлось гадать, что вы на самом деле имеете в виду, неясно, действительно ли вам нужно передать пустой здесь -документ в команду. Я построил код, соответствующий вашему примеру, но, по-видимому, первая совпадающая часть не всегда состоит из 8 символов, и вы имели в виду последние два символа перед.dat (, включая _
, ), а не только последний.