Сортировка файлов по дирректориям

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
BAV_Lug
сержант
Сообщения: 299
Зарегистрирован: 2006-06-02 15:38:28
Откуда: Харьков

Сортировка файлов по дирректориям

Непрочитанное сообщение BAV_Lug » 2009-04-23 14:09:49

Есть директория в которой хранятся файлы вида

Код: Выделить всё

20090422......
20090423......
20090424......
и т.д.

Нужно написать скрипт который бы переносил эти файлы по директориям вида "год\месяц\дата"
Чето я тормознулся в самом начале. Чем парсить имена файлов никак не могу сообразить.
Можно конечно написать это на ПХП (там я знаю как распарсить), но хочется на SH.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

BAV_Lug
сержант
Сообщения: 299
Зарегистрирован: 2006-06-02 15:38:28
Откуда: Харьков

Re: Сортировка файлов по дирректориям

Непрочитанное сообщение BAV_Lug » 2009-04-23 14:55:41

Ладно я тут почитал, и понял что парсить похоже прийдется awk
Но вот как ему задать, чтобы он вывел например первые четыре символа из строки, я так и не понял :(

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Сортировка файлов по дирректориям

Непрочитанное сообщение zg » 2009-04-23 15:38:12

BAV_Lug писал(а):Ладно я тут почитал, и понял что парсить похоже прийдется awk
да вроде и обычный шелл подойдёт

BAV_Lug
сержант
Сообщения: 299
Зарегистрирован: 2006-06-02 15:38:28
Откуда: Харьков

Re: Сортировка файлов по дирректориям

Непрочитанное сообщение BAV_Lug » 2009-04-23 15:42:47

Уже написал. Всем спасибо :)

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Сортировка файлов по дирректориям

Непрочитанное сообщение zg » 2009-04-23 15:48:45

BAV_Lug писал(а):Уже написал. Всем спасибо :)
дак выложи, раз уж тему поднял -)

BAV_Lug
сержант
Сообщения: 299
Зарегистрирован: 2006-06-02 15:38:28
Откуда: Харьков

Re: Сортировка файлов по дирректориям

Непрочитанное сообщение BAV_Lug » 2009-04-23 16:18:20

Вот, что вышло

Код: Выделить всё

#!/bin/sh

PathToLoad1="/home/web/usr/home/arhivwebcam/cam1"
PathToCopy1="/home/web/usr/home/arhivwebcam/sort/cam1"

cd $PathToLoad1
for i in `ls -A`
do
   if [ -f $i ]
   then
      year=`echo $i | awk -F\. '{print substr($1, 1, 4)}'`
      month=`echo $i | awk -F\. '{print substr($1, 5, 2)}'`
      day=`echo $i | awk -F\. '{print substr($1, 7, 2)}'`
      if ( ! [ -d "$PathToCopy1/$year" ] )
      then
         mkdir $PathToCopy1/$year
      fi
      if ( ! [ -d "$PathToCopy1/$year/$month" ] )
      then
         mkdir $PathToCopy1/$year/$month
      fi
      if ( ! [ -d "$PathToCopy1/$year/$month/$day" ] )
      then
         mkdir $PathToCopy1/$year/$month/$day
      fi
      mv $i $PathToCopy1/$year/$month/$day/$i
   fi
done
А вообще собираюсь статью написать, про то как я прикручивал веб камеры на удаленном объекте с просмотром их и ведением архива.

Аватара пользователя
f_andrey
майор
Сообщения: 2651
Зарегистрирован: 2007-12-26 1:22:58
Откуда: СПб
Контактная информация:

Re: Сортировка файлов по дирректориям

Непрочитанное сообщение f_andrey » 2009-04-23 16:44:16

BAV_Lug писал(а):А вообще собираюсь статью написать, про то как я прикручивал веб камеры на удаленном объекте с просмотром их и ведением архива.
Если вдруг соберетесь, то в плане конструктивной критики, подготовьтесь по теме посерьезнее, а то пока ваш скрипт ..., ну в общем легче новый написать чем имеющийся править ;)
Если ваша тема перенесена, то смотри http://forum.lissyara.su/viewtopic.php?f=1&t=32308

BAV_Lug
сержант
Сообщения: 299
Зарегистрирован: 2006-06-02 15:38:28
Откуда: Харьков

Re: Сортировка файлов по дирректориям

Непрочитанное сообщение BAV_Lug » 2009-04-23 16:49:12

f_andrey писал(а):
BAV_Lug писал(а):А вообще собираюсь статью написать, про то как я прикручивал веб камеры на удаленном объекте с просмотром их и ведением архива.
Если вдруг соберетесь, то в плане конструктивной критики, подготовьтесь по теме посерьезнее, а то пока ваш скрипт ..., ну в общем легче новый написать чем имеющийся править ;)
Давайте от критики переходить к конструктиву. То, что я привел, успешно работает. Да может не красиво выглядит, но работает.
Конечно обхаять чужое проще, чем что-то по делу написать.

PS Жаль, что на этом форуме запрещено ругаться матом. Выводят просто такие люди.

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Сортировка файлов по дирректориям

Непрочитанное сообщение zg » 2009-04-23 16:54:17

f_andrey писал(а):ну в общем легче новый написать чем имеющийся править
-))) взял бы да написал

Код: Выделить всё

#!/bin/sh

for FILE in 20090422 20090423 20090424
do
  YEAR=${FILE%[0-9][0-9][0-9][0-9]}
  MONTH=${FILE%[0-9][0-9]}
  MONTH=${MONTH#[0-9][0-9][0-9][0-9]}
  DAY=${FILE#[0-9][0-9][0-9][0-9][0-9][0-9]}

  DIR=$YEAR/$MONTH/$DAY

  echo "[-d \"$DIR\"] || mkdir -p \"$DIR\""
  echo "mv $FILE $DIR/$FILE"
done
Результат будет такой

Код: Выделить всё

[-d "2009/04/22"] || mkdir -p "2009/04/22"
mv 20090422 2009/04/22/20090422
[-d "2009/04/23"] || mkdir -p "2009/04/23"
mv 20090423 2009/04/23/20090423
[-d "2009/04/24"] || mkdir -p "2009/04/24"
mv 20090424 2009/04/24/20090424
в принципе это готовый шелл код :smile:

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Сортировка файлов по дирректориям

Непрочитанное сообщение zg » 2009-04-23 17:39:42

более правильный вариант с awk

Код: Выделить всё

#!/bin/sh

SDIR=ff
DDIR=/some/dir

ls -1 "$SDIR" | awk '{print substr($1,1,4), substr($1,5,2), substr($1,7,2), $1}' | while read YEAR MONTH DAY FILE
do
  DIR=$DDIR/$YEAR/$MONTH/$DAY

  echo "[-d \"$DIR\"] || mkdir -p \"$DIR\""
  echo "mv $SDIR/$FILE $DIR/$FILE"
done
SDIR - папка с файлами (типа source dir)
DDIR - точка назначения (типа destination dir)

:smile: