Страница 1 из 1

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

Добавлено: 2009-04-23 14:09:49
BAV_Lug
Есть директория в которой хранятся файлы вида

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

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

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

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

Добавлено: 2009-04-23 14:55:41
BAV_Lug
Ладно я тут почитал, и понял что парсить похоже прийдется awk
Но вот как ему задать, чтобы он вывел например первые четыре символа из строки, я так и не понял :(

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

Добавлено: 2009-04-23 15:38:12
zg
BAV_Lug писал(а):Ладно я тут почитал, и понял что парсить похоже прийдется awk
да вроде и обычный шелл подойдёт

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

Добавлено: 2009-04-23 15:42:47
BAV_Lug
Уже написал. Всем спасибо :)

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

Добавлено: 2009-04-23 15:48:45
zg
BAV_Lug писал(а):Уже написал. Всем спасибо :)
дак выложи, раз уж тему поднял -)

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

Добавлено: 2009-04-23 16:18:20
BAV_Lug
Вот, что вышло

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

#!/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
А вообще собираюсь статью написать, про то как я прикручивал веб камеры на удаленном объекте с просмотром их и ведением архива.

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

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

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

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

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

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

Добавлено: 2009-04-23 16:54:17
zg
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:

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

Добавлено: 2009-04-23 17:39:42
zg
более правильный вариант с 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: