Как я могу давать новые имена файлам, пока программа работает в цикле в cshell?

Получить обзор всех устройств (в этом примере :/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, если хотите иметь элементы управления + меню.

Дополнительные параметры модуля v4l2 в VLC.

1
09.10.2019, 13:14
3 ответа

Если вы действительно не можете перейти на более разумную оболочку, то в cshвы можете использовать модификатор :sдля замены строк внутри переменных

Пр.

#!/bin/csh -f

foreach file ( *.dat )
echo xy2sac $file $file:s/disp_post_mij_conv0000//:s/.dat/.sac/
end

Удалите echo, если вы уверены, что имена файлов правильные

2
27.01.2020, 23:30

Предложение :использовать 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 "(, который его выполнит)

0
27.01.2020, 23:30

Внимание :Я не знал, что вы используете 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 (, включая _, ), а не только последний.

0
27.01.2020, 23:30

Теги

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