2014-12-03 7 views
0

Я работаю с камерой Ethernet, которая поставляется с Busybox.
Одноплатный компьютер подключен к нему через RS232. SBC необходимо отправить одну команду на камеру, чтобы сделать снимок jpg, сохранить его на карте памяти CF и назовите его в последовательном порядке (0001, 0002 и т. Д.).
Это код, я использую, чтобы взять один снимок, без последовательного именования:Сценарий оболочки Linux с сохранением файла и последовательным именем файла

wget http://127.0.0.1/snap.php -O /mnt/0/snapfull`date +%d%m%y%H%M%S`.jpg 

Мне нужно, чтобы файлы были названы последовательно. Это код, который я нашел here, который выполняет последовательное переименование для уже существующих файлов, но я заметил, что когда код выполняется еще раз после переименования нескольких файлов, перекрестное переименование может привести к удалению файлов (я запустил код, когда файлы от 0001.jpg до 0005.jpg были найдены в каталоге, и файл 0004.jpg был удален, потому что найденный файл cmd указан 0005 перед файлом 0004, поэтому он переименовал оба файла и файл 0004 был удален.)

find . -name '*.jpg' | awk 'BEGIN{ a=0 }{ printf "mv %s %04d.jpg\n", $0, a++ }' | dash

То, что я ищу, представляет собой один сценарий оболочки, который может запрашивать несколько раз в день SBC, чтобы камера делала снимок, сохраняя его и назовите его в последовательном порядке, основываясь на последнем номере используется (если последний файл 0005.jpg, следующее изображение wil l называться 0006.jpg).
Было бы здорово добавить эту возможность именования в строку ввода fisrt, которую я прикреплял, чтобы я мог включить ее в сценарий sh, который может быть вызван SBC.

+0

Почему это помечено Баш, если вы используете либо BusyBox, при условии shell (что в лучшем случае может быть золой) или явно вызывать тире? –

+1

Кроме того, использование awk для создания команд оболочки таким образом - очень и очень плохая практика. Подумайте, что произойдет, если у вас есть файл с именем '$ (rm -rf /). Jpg'. (Конечно, '/' должен быть разделителем каталогов, но поскольку вы делаете рекурсивную находку, это все равно будет работать). –

+0

Чтение связанного ответа SO, я несколько огорчен тем, сколько «ответов» было предоставлено с этой и другими уязвимостями и ошибками. Однако принятый вопрос требует только дополнительного цитирования, чтобы быть безопасным, и я отредактировал его для исправления. –

ответ

0

Это будет работать тогда и только тогда, когда ваши имена файлов идентичны, за исключением числовой части, а числовая часть заполнена настолько, что они имеют одинаковое количество цифр.

set -- *.jpg   # put the sorted list of names on argv 
while [ $# -gt 1 ]; do # as long as there's more than one... 
    shift    # ...pop something off the beginning... 
done 
num=${1#*snapfull}     # trim the leading alpha part of the name 
num=${num%.*}      # trim the trailing numeric part of the name 
printf -v num '%04d' "$((num + 1))" # increment the number and pad it out 

wget http://127.0.0.1/snap.php -O "snapfull${num}.jpg" 
+0

Спасибо за ваши усилия! Это ошибка, которую я получаю. ./snap3.sh: 10: arith: синтаксическая ошибка: «num + 1» «Я поместил скрипт в каталог, где файлы должны быть сохранены. Когда я помещаю скрипт в/bin, как указать путь в коде моментального снимка? Что-то вроде этого? 'wget http://127.0.0.1/snapfull.php -O/mnt/0 /" snapfull $ {num} .jpg "' – Rick

+0

@Rick, какая у вас оболочка? '$ ((num + 1))' действителен в любой оболочке, совместимой с POSIX sh, при условии, что 'num' был правильно удален, чтобы быть допустимым числом.Я бы предложил тестирование, чтобы убедиться, что зачистка работает правильно, т.е. эхо-значение. –

+0

Что касается пути - другие части этого кода будут работать некорректно, если текущий каталог не является местом с выходными файлами, поэтому я предполагаю, что вы положили 'cd/mnt/0 'ранее в вашем скрипте. –

1

Это код, я на самом деле тестирования и, кажется, работает на основе @Charles ответа:

#!/bin/sh 
set -- *.jpg    # put the sorted list of picture namefiles on argv (the number of files on the list can be requested by echo $#) 
while [ $# -gt 1 ]; do # as long as the number of files in the list is more than 1 ... 
    shift     # ...some rows are shifted until only one remains 
done 
if [ "$1" = "*.jpg" ]; then # If cycle to determine if argv is empty because there is no jpg  file present in the dir. 
    set -- snapfull0000.jpg  # argv is set so that following cmds can start the sequence from 1 on. 
else 
    echo "More than a jpg file found in the dir." 
fi 

num=${1#*snapfull}      # 1# is the first row of $#. The alphabetical part of the filename is removed. 
num=${num%.*}       # Removes the suffix after the name. 
num=$(printf "%04d" "$(($num + 1))") # the variable is updated to the next digit and the number is padded (zeroes are added) 

wget http://127.0.0.1/snapfull.php -O "snapfull${num}.jpg" #the snapshot is requested to the camera, with the sequential naming of the jpeg file. 
+0

FWIW, '$ ((num + 1))' в отличие от '$ (($ num + 1))' не был опечаткой - на POSIX-совместимой оболочке, внутренний '' 'не должен необходимо. –

+0

Я попробовал еще раз формат, который вы предлагаете, но я все время получаю сообщение об ошибке. У меня также есть еще одна проблема с остановкой последовательности, которую вы можете увидеть здесь (http://stackoverflow.com/questions/27324506/issue-with-sequential-file-saving-and-naming). – Rick

Смежные вопросы