LINUX.ORG.RU
ФорумAdmin

BASH_USB


0

1

Привет Есть куча флешек с которых сливается видео с регистраторов. На винде скрипт выгледил так;

chcp 1251
set "output=y:\" 
  
for /f "skip=1 tokens=1-3" %%i in ('2^>nul WMIC LogicalDisk WHERE "DriveType=2 AND Size>0" GET Name^, VolumeSerialNumber^, VolumeName') do ( 
    pushd "%%~i" 
    set "DriveName=%%j_%%k" 
    for /r /d %%d in (videodata.?) do ( 
        pushd "%%~d" 
        call :process_dir 
        popd 
    ) 
    popd 
) 
exit 
 chcp 1251
:process_dir 
for %%a in (*.*) do if not "%%~xa"==".txt" ( 
for /f "tokens=1-3 delims=. " %%x in ("%%~ta") do call :get_date %%y %%x 
call :copy_file "%%~a" 
) 
exit /b 
 chcp 1251
:get_date 
set "month=%~1" 
set "day=%~2" 
if "%month:~0,1%"=="0" set "month=%month:~1% 
for /f "tokens=%month%" %%m in ("€нварь февраль март апрель май июнь июль август сент€брь окт€брь но€брь декабрь") do set "month=%%m" 
exit /b 
 chcp 1251
:copy_file 
if not exist "%output%\%month%\%day%\%DriveName%" md "%output%\%month%\%day%\%DriveName%"  
move /y ".\%~1" "%output%\%month%\%day%\%DriveName%\" 
exit /b 

Вот так как это переделать под Linux Вообще смысл какой когда я вставляю флешки у меня в mnt появляются папки (345,456_2 и тд ) внутри этих папок есть папка     vidodata и из нее надо переместить файла с расширением msn3 . Вот тут не просто перенести,надо узнать когда был создан файл и и создать папку с месяцом(октябрь) потом с датой(02) и названием папки откуда был перенесен файл (345).

Вот под виндой создается папка ОКТЯБРЬ дальше 02(дата) дальше 345(название флешки) и соответственно файлы (все что в папке). Как то так . Как перенести скрипт под линуксом незнаю хоть пните куда капать


SOURCE=/tmp
DEST_DIR=/tmp/DEST
find ${SOURCE}/*/videodata -type d | while read DIR 
do
   FROM_FLASH=`echo ${DIR} | cut -f3 -d\/` 
   find ${DIR} -maxdepth 1 -type f -printf '%Ad %AB |%p\n' | while read FILE_STR
      do 
         echo $FILE
         MOUNTH=`echo $FILE_STR | cut -f2 -d" "` 
         DAY=`echo $FILE_STR | cut -f1 -d" "`
         DEST=${DEST_DIR}/$MOUNTH\/$DAY\/$FROM_FLASH
	 FILE=`echo $FILE_STR | cut -f2 -d\|`
         test -d ${DEST} || mkdir ${DEST} -p
	 cp $FILE ${DEST}/
done
done

Это решение в лоб.

SOURCE - в вашем случае это /mnt, где создаются точки монтирования флеш накопителей.
DEST_DIR - директория, где создаются поддиректории /месяц/день/откуда_скопировано/ .

kostik87 ★★★★★
()

Вот «на глаз». Нужно проверять (пока проверяешь, замени cp на echo). По крайней мере узнаешь какие фишки использовать:

#!/bin/sh
SRC="/mnt/345 /mnt/456_2" # Откуда - список абсолютных путей через пробел
DST="/home/user/registrator" # Куда
FILE_DIR="vidodata" # Каталог на флешке

OLD_DIR=`pwd`

for DIR in $SRC ; do
	if [[ ! -d "$DIR/$FILE_DIR" ]]; then
		continue
	fi
	
	cd "$DIR/$FILE_DIR"
	
	for FILE in *.msn3 ; do
		# Это нужно хорошо проверить:
		DATE=`LC_TIME="ru_RU.UTF-8" find -name "$FILE" -printf %Tb/%Td` 
		
		mkdir -p "$DST/$DATE"
		cp "$FILE" "$DST/$DATE/$FILE"
	done
	
done

cd "$OLD_DIR"

Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 1)
Ответ на: комментарий от kostik87

Забыл указать, что копировать нужно только файлы msn3, нужно эту строку:

find ${DIR} -maxdepth 1 -type f -printf '%Ad %AB |%p\n' | while read FILE_STR
изменить:
find ${DIR} -maxdepth 1 -type f -iname *.msn3 -printf '%Ad %AB |%p\n' | while read FILE_STR

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 1)
Ответ на: комментарий от kostik87

Ок спасибо завтра с утра проверю

avolon
() автор топика
Ответ на: комментарий от kostik87

Выдает ошибку

find: -printf: unknown primary or operator
avolon
() автор топика
Ответ на: комментарий от Kroz

Пробывал ваш скрипт тоже не работает Если сделать (DATE=`LC_TIME=«ru_RU.UTF-8» find -name «$FILE» -printf %Tb/%Td` ) echo $DATE Выводит пустую строку!

avolon
() автор топика
Ответ на: комментарий от avolon

Ну а что же вы не сказали, что у вас MacOS, тогда читайте документацию по find в составе MacOS и правьте код скрипта.

man find

Но, насколько могу судить, по документации, доступной в Internet, у find в составе MacOS нет параметра printf: https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPag... .

Значит нужно использовать другие утилиты.

Ну либо поставьте Linux.

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 1)
Ответ на: комментарий от avolon

Эта утилита вам не поможет. Вы можете воспользоваться конструкцией:

find ${DIR} -maxdepth 1 -type f -iname *.msn3 -exec stat {} \;
Но тут уж придётся переписывать остальную часть кода и почитать документацию по stat.
man stat

Ну либо можете попробовать скачать исходные коды GNU findutils и попробовать собрать из них утилиту find под MacOS, ну и использовать её.

kostik87 ★★★★★
()
Ответ на: комментарий от avolon

findutils поставил

Откуда, из репозитория MacOSx ? Я вам предлагаю скачать исходные коды GNU (Linux) версии findutils и скомпилировать их из исходных кодов, если, конечно нет готового пакета для MacOSx с Linux версией утилиты find.

А так разбирайтесь как переписать скрипт с использованием утилит, которые доступны в MacOSx и их особенностей.

kostik87 ★★★★★
()
Ответ на: комментарий от avolon

И что findutils собираются из исходников GNU findutils ?

Даже если так, то они заменяют findutils из поставки macosx или ставятся в отдельную директорию или под другим именем, например find_gnu ?

В общем не знаю, у меня под рукой macosx нет, так что проверить что и куда ставит команда 'brew install findutils' возможности у меня нет.

Так что уточняйте что она ставит, куда и как это использовать.

Ну либо переписывайте скрипт с использованием того набора утилит, который есть в MacOSX.

kostik87 ★★★★★
()
Ответ на: комментарий от kostik87

Блин буду думать ((( просто у мну Ubuntu а где скидывают флешки там мак стоит ((((( И не спрашивайте почему мак ))))).

avolon
() автор топика
Ответ на: комментарий от kostik87

Посоветовали Big Mean Folder Machine все хорошо только она не создает папку с которой она скопировала файл (((

avolon
() автор топика
Ответ на: комментарий от avolon

Тут не знаю, читайте документацию, можете создавать её в ручную, а потом с ней и синхронизировать.

Ну либо переписывайте скрипт.

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 1)

выгледил

это «выгледит» как злостное 5.5. Особенно в сочетании с «пробывал», «мну» и т.д.

куда капать

Куратору, куда ж еще... Впрочем, уже накапали небось - в «Некорректные».

slackwarrior ★★★★★
()
Последнее исправление: slackwarrior (всего исправлений: 1)
Ответ на: комментарий от avolon
SOURCE=/tmp
DEST_DIR=/tmp/DEST
MOUNTHES="Январь Февраль Март Апрель Май Июнь Июль Август Сентябрь Октябрь Ноябрь Декабрь"
find ${SOURCE}/*/videodata -type d | while read DIR 
do
   FROM_FLASH=`echo ${DIR} | cut -f3 -d\/` 
   find ${DIR} -maxdepth 1 -type f -iname *.msn3 -exec stat -c "%y\|%n" {} \; | while read FILE_STR
      do 
	 MOUNTH_NUM=`echo $FILE_STR | cut -f1 -d" " | cut -f2 -d-`
	 MOUNTH=`echo $MOUNTHES | cut -f$MOUNTH_NUM -d" "`
         DAY=`echo $FILE_STR | cut -f1 -d" " | cut -f3 -d-`
         DEST=${DEST_DIR}/$MOUNTH\/$DAY\/$FROM_FLASH
	 FILE=`echo $FILE_STR | cut -f2 -d\|`
         test -d ${DEST} || mkdir ${DEST} -p
	 cp $FILE ${DEST}/
      done
done

А да, у меня другой stat, в общем почитайте документацию по вашему stat, в FILE_STR должно быть примерно следующее:

2013-10-03 20:19:30.689136806 +0400|/tmp/dir1/videodata/fil13.msn3
Ну либо подправьте скрипт больше.

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 2)

хоть пните куда капать

в стакан, валерьянки, мне

lazyklimm ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.