Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Поиск и вывод размера копируемого файла!  (Прочитано 391 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Avolon

  • Автор темы
  • Любитель
  • *
  • Сообщений: 94
    • Просмотр профиля
Добро время суток!
Есть  скрипт который находит определеные файлы смотрит когда были они созданы,и копирует по папкам(год/месяц/день/(название папки на флешки где лежат файлы)) !
Так вот как сделать так чтоб до копирования узнать колличество файлов и общий размер найденых файлов ,и
Получить в логах какой обьем копируется файл и скока всего скопировалось количество и обьем ?
Как то так!
Копируется в разные папки и это меня вводит в замешательство
вот скрипт часть

SOURCE=`find /mnt/894/sda1 -mindepth 1 -maxdepth 1 -type d`


DEST_DIR=/opt/bacula/Videoreg
MOUNTHES="январь февраль март апрель май июнь июль август сентябрь октябрь ноябрь декабрь"

find ${SOURCE} -type d | while read DIR
do
   FROM_FLASH=`echo ${DIR} | cut -f3 -d \/`

   find ${DIR} -maxdepth 1 -type f -iname 0*.* -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-`

         echo $FILE_STR


         DEST=${DEST_DIR}/$MOUNTH\/$DAY\/$FROM_FLASH
         FILE=`echo $FILE_STR | cut -f2 -d\|`
         test -d ${DEST} || mkdir ${DEST} -p
        echo $FILE ${DEST}/

        cp --preserve $FILE ${DEST}/


В логах получаю такую инфу

2016-10-02 00:03:00.000000000 +0000|/mnt/894/sda1/894/videodata/00000002.24h
/mnt/894/sda1/894/videodata/00000002.24h /opt/bacula/Videoreg/октябрь/02/894/
2016-10-02 00:03:00.000000000 +0000|/mnt/894/sda1/894/videodata/00000002.msn3
/mnt/894/sda1/894/videodata/00000002.msn3 /opt/bacula/Videoreg/октябрь/02/894/
2016-10-01 22:41:00.000000000 +0000|/mnt/894/sda1/894/videodata/00000001.msn3
Вот както так!

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 1967
    • Просмотр профиля
Re: Поиск и вывод размера копируемого файла!
« Ответ #1 : 03 Октябрь 2016, 11:04:56 »
Колличество файлов:
Код: Bash
  1. FILES_N=$(wc -l <<<"$FILES")

Общий размер в байтах:
Код: Bash
  1. FILES_SIZE=$(xargs -d '\n' du -b <<<"$FILES" | awk '{sum=$1+sum}END{print sum}')

FILES - список файлов
« Последнее редактирование: 03 Октябрь 2016, 11:07:40 от renzrv »

Оффлайн Azure

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 5660
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Re: Поиск и вывод размера копируемого файла!
« Ответ #2 : 03 Октябрь 2016, 11:20:54 »
до копирования узнать
Что Вы собираетесь с этими данными сделать? А так есть командa du с ключом — скармливаете ей список файлов, получаете TOTAL размер.
P.S. Сам скрипт реально слабоватый… 3(три!!!) find? Реально лишнее. Вам стоит применить в скрипте path-expansion — сразу отпадет необходимость в стольких циклах и find’ах
И переводить порядковые номера месяцев в кирилические названия — создавать себе проблемы в будущем, например с той же сортировкой.

Пользователь добавил сообщение 03 Октябрь 2016, 11:40:12:
renzrv, вот до такого
xargs -d '\n' du -b <<<"$FILES" | awk '{sum=$1+sum}END{print sum}'
даже и не додумался бы :o И xargs, да еще и с -d '\n', и awk(понимаю Вашу любовь к этому инструменту, но для таких задач его черезчур)… Если Вы считаете по 1 файлу, почему не stat, хотя даже он прекрасно принимает список фалов без всякого xargs. А чтобы избежать проблем с пробелами в именах стоит список файлов хранить в виде массива…

Пользователь добавил сообщение 03 Октябрь 2016, 11:44:23:
P.P.S. Для любителей awk: sum=$1+sum короткая запись sum=+$1
« Последнее редактирование: 03 Октябрь 2016, 11:44:23 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 1967
    • Просмотр профиля
Re: Поиск и вывод размера копируемого файла!
« Ответ #3 : 03 Октябрь 2016, 12:05:40 »
Azure,
Этот пример со списком файлов с разделителем \n, проблем с пробелами нет, и массив в общем-то не нужен.
Цитировать
почему не stat,
И как stat примет такой список без xargs или цикла, если в списке пару тысяч файлов?

Avolon,
Если копируется по одному файлу за цикл, то количество и объем считать так:
Код: Bash
  1. ((FILES_N+=1))
  2. FILES_SIZE=$((FILES_SIZE+$(du -b "$FILE" | cut -f1)))
или
Код: Bash
  1. FILES_SIZE=$((FILES_SIZE+$(stat -c '%s' "$FILE")))
и после done выводить значение FILES_N и FILES_SIZE в лог.
« Последнее редактирование: 03 Октябрь 2016, 12:18:00 от renzrv »

Оффлайн Azure

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 5660
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Re: Поиск и вывод размера копируемого файла!
« Ответ #4 : 03 Октябрь 2016, 12:13:48 »
как stat примет такой список без xargs или цикла
Так Вы же по одному файлу передаете! Почему в этом случае stat лучше du? До потому что с опцией -c %s сразу выдаст размер (без всяких конвееров и дополнительных обработок)!
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 1967
    • Просмотр профиля
Re: Поиск и вывод размера копируемого файла!
« Ответ #5 : 03 Октябрь 2016, 12:46:04 »
Цитировать
Так Вы же по одному файлу передаете
xargs как раз передает несколько аргументов за раз:
FILES - список из 3743 файлов.
Код: Bash
  1. xargs -d '\n' sh -c 'echo $#' a <<< "$FILES"
Вывод:
2574
1167
sh был вызван 2 раза, не?

Цитировать
Почему в этом случае stat лучше
Да, согласен, одним статом лучше.

Оффлайн Azure

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 5660
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Re: Поиск и вывод размера копируемого файла!
« Ответ #6 : 03 Октябрь 2016, 12:47:52 »
Или «лыжи не едут…»© или я чего-то не понимаю
Код: Bash
  1. SOURCE=`find /mnt/894/sda1 -mindepth 1 -maxdepth 1 -type d` # получили «/mnt/894/sda1/<какое-то число>»
  2. FROM_FLASH=`echo ${DIR} | cut -f3 -d \/` # всегда будет «894», зачем это делать в цикле?
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Avolon

  • Автор темы
  • Любитель
  • *
  • Сообщений: 94
    • Просмотр профиля
Re: Поиск и вывод размера копируемого файла!
« Ответ #7 : 03 Октябрь 2016, 13:26:38 »
Так сори отлучался!!
Давайте попорядку откуда родился это все!!

Есть некоторое сетевое устройство у которого открыт ftp !
При поподание на этот FTP вижу структуру

sda1_
         |
          894
               |
                videodata
                               |
                                 файлы начинающие на 0


Так вот curlftpfs ftp://user:123@192.168.0.186 /mnt/894 монтирую в папку 894
так вот мне надо скопировать все файлы в другой каталог /opt/bacula/videoreg/где должны создатся папки когда был сделан файл тоесть (год) потом (месяц) потом  (день) и потом название папки 894 ---вот так /opt/bacula/Videoreg/октябрь/01/894
В идеале ещебы и проверку солько было в начале файлов и сколько в конце ((
Н а устройстве может быть файлы  за 2 дня половина например 2 октября ,а другой 3 октября и посчитать нет возможности или я просто не знаю как!

Вот както так
P.S  и еще как  сделать так чтоб при потере связи с ip 192.168.0.186 все остонавливолось и закрывалось если даже он не докопировал!


Оффлайн Azure

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 5660
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Re: Поиск и вывод размера копируемого файла!
« Ответ #8 : 03 Октябрь 2016, 13:37:17 »
Тогда Вы неправильно подходите к решению задачи. Ее надо разделить на 2: копирование по сети и сортировка по папкам. 1-я выполняется curl`ом (там куча настроек) без всяких монтирований, 2-я — скриптом в 1-2 строки. (если не получится — поможем написать).
« Последнее редактирование: 03 Октябрь 2016, 13:43:36 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 1967
    • Просмотр профиля
Re: Поиск и вывод размера копируемого файла!
« Ответ #9 : 03 Октябрь 2016, 13:44:24 »
Цитировать
Так вот как сделать так чтоб до копирования
Как вариант:
1. Создать список:
Код: Bash
  1. FILES="$(find ...)"
2. Посчитать кол-во, сумм. размер.
3. Потом в цикле его обрабатывать:
Код: Bash
  1. while read STR ; do
  2.  ...
  3. done <<<"$FILES"

Цитировать
P.S  и еще как  сделать так чтоб при потере связи с ip 192.168.0.186 все остонавливолось и закрывалось если даже он не докопировал!
Код: Bash
  1. command || exit
« Последнее редактирование: 03 Октябрь 2016, 13:46:20 от renzrv »

Оффлайн Azure

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 5660
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Re: Поиск и вывод размера копируемого файла!
« Ответ #10 : 03 Октябрь 2016, 14:01:57 »
sh был вызван 2 раза, не?
Понял Вы о чем. Согласен, что для больших количеств стоит использовать xargs. Тем не менее в нашем случае я бы пошёл на маленькую хитрость: посчитал объем папки и отнял от него объем без исходных файлов:echo $[$(du -sb /mnt/894/sda1/*/ |cut -f1) - $(du -sb --exclude='0*.*' /mnt/894/sda1/*/ | cut -f1)]
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Avolon

  • Автор темы
  • Любитель
  • *
  • Сообщений: 94
    • Просмотр профиля
Re: Поиск и вывод размера копируемого файла!
« Ответ #11 : 03 Октябрь 2016, 14:11:22 »

Тогда Вы неправильно подходите к решению задачи. Ее надо разделить на 2: копирование по сети и сортировка по папкам. 1-я выполняется curl`ом (там куча настроек) без всяких монтирований, 2-я — скриптом в 1-2 строки. (если не получится — поможем написать).
А можно поподробнее?
Тоесть предлагает просто скопировать все что есть из папки 894  куданить в темп и потом оттуда переносить не копируя а имено переносить по заданным критериям ???

Оффлайн Azure

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 5660
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Re: Поиск и вывод размера копируемого файла!
« Ответ #12 : 03 Октябрь 2016, 14:17:32 »
Зачем «все что есть»? Только нужные файлы. И я бы не переносил, раз есть проблемы с обрывами сети. А структурировал по папкам не сами файлы, а ссылки на них (т.е. cp с опцией -s или -l если хотите)
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

 

Страница сгенерирована за 0.107 секунд. Запросов: 24.