LINUX.ORG.RU

Как быстро скопировать с изменением имени много файлов?

 , ,


0

2

Есть задача скопировать кучу (около 2,500,000) мелких файлов в директорию при этом еще и переименовать их. Надо на баше ибо есть скрипт в котором есть $name в которую падает исходное имя файла и $name2 в которую падает новое имя файла. Как это быстрее сделать? машинка не новая и обычным cp её загружает ажно на целые сутки, а это не приемлемо...

Перемещено JB из talks



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

Да, еще, все это крутится на CentOS 6.2 машинка Целка 2.5, 2Гб DDR2

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

Идея в том, что tar и rsinс копируют блоками, а не по одному файлу, как cp. Хотя скорее всего идея глупая и я ошибаюсь:)

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

aol

у тебя на руках есть какие-то результаты, чтобы так нескромно выпячивать своё чсв?

ну у меня есть каталог с 22800 файлами, который занимает 1.5Мб (без внутренних файлов, только сам файл каталога). Если записать туда мелкий файл (<= 4K) командой cp, потребуется переписать 1500К+4К (1500К каталога, и 4К данных, т.к. блок у меня 4К), а если сделать там ссылку командой ln (хардлинк), то потребуется переписать всего 1500К. Я конечно понимаю, что 1504К > 1500К, но ИМХО ненамного. Я не прав? В случае ТС, у которого не 23К файлов, а 2500К, ситуация естественно на 2 порядка хуже. Экспериментальную проверку делай сам, раз уж ты про чсв начал тут рассказывать...

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

DonkeyHot

Соответственно бороться нужно по каждому направлению

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

DonkeyHot

более новыми ФС

мне только одна такая ФС известна: FAT. Остальные системы и так «деревянные». Включая NTFS, EXT2, EXT3 & EXT4.

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

liquidpredator

насколько я помню когда удаляешь эвент вместе с ним и видео удаляется.

вот тут-то хардлинк и поможет:
1. делаем хардлинк видеофайла в специальном каталоге video
2. удаляем эвент, с ним удаляется видео. Но то видео, что в спец-каталоге остаётся.

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

Да, это я понимаю, но тут проблема заключается в том, что мне нужно видео за сутки на не (24*6) видеозаписей по 10 минут. + опять же именует их ZM как-то своим хитрым способом а не по дате/событию и выцеплять их неудобно. Хотя производительность можно спасти... надо думать в общем...

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

liquidpredator

if [ `ls -l ${inpath}/${diry}/${dirm}/${dird}/.${n}/${fn} | awk '{print $5}'` -gt 0 ]; then

facepalm.jpg
теперь понятно, почему у вас тормозит. Проверить то, что длинна файла >0 можно проще: if [ -s file.txt ]; then

liquidpredator

i=$((i+1)) p=$(printf %.8d $i) ln ${inpath}/${diry}/${dirm}/${dird}/.${n}/${fn} ${jpgpath}/${p}.jpg

ну что вы хренью страдаете? пусть i в начале будет не 0, а 10000000, тогда оно гарантированно будет 8и значным.

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

liquidpredator

Да, это я понимаю, но тут проблема заключается в том, что мне нужно видео за сутки на не (24*6) видеозаписей по 10 минут.

ну клеить 24*6 файлов по любому быстрее, чем 100500К джепегов.
Вы ещё учтите, что клеить видео, это почти просто слияние файлов (только заголовок у каждого файла отбрасываем), а вот джепеги ВСЕ надо перекодировать в какой-нить битмап, а потом это несжатое видео пожать по фреймам. 18 часов это даже как-то быстро для такой машинки...

liquidpredator

опять же именует их ZM как-то своим хитрым способом

он их подряд делает? вот и отсортируйте их по дате изменения. ls -t вам в помощь.

liquidpredator

надо думать в общем...

думать надо прежде всего о том, ЧТО тормозит, а не о том, как ускорить какую-нить cp. Слить несколько видеофайлов в один - задача на секунду. А копировать покадрам, а потом перекодировать кадры в jpgах в видео - задача на сутки. Всегда ваш К.О.

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

вот тут-то хардлинк и поможет:

пыщ-пыщ... (это к Как быстро скопировать с изменением имени много файлов? (комментарий))

ты бы для начала прочила ОП, а потом определился, вредны тут хардлинки, или полезны ;)

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

aol

ты бы для начала прочила ОП, а потом определился, вредны тут хардлинки, или полезны ;)

где «тут»? Если ты не понял, я о том, что хардлинки полезны, если что-то удаляет файлы, а мы не хотим, что-бы они удалялись. Скорость тут не играет никакой роли, файлы можно было-бы просто скопировать, но в этом нет никакого смысла.

Ну и тебе полезно почитать вот этот пост: Как быстро скопировать с изменением имени много файлов? (комментарий)

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

Собственно слегка переписал. Заставил ZM создавать видео если event старше чем 1 минута далее:

#!/bin/bash
#Параметры даты и камеры для создания видео и проверка.
workdate=$1
cam=$2
if [ "Z"$1 = "Z" ]; then
       echo "Укажите Дату для создания записи"
       exit 1
fi
if [ "Z"$2 = "Z" ]; then
       echo "Укажите Камеру для создания записи"
       exit 1
fi
# путь до эвентов ZM
evpath="EVENT_PATH"
diry=$(date -d "${workdate}" +%y)
dirm=$(date -d "${workdate}" +%m)
dird=$(date -d "${workdate}" +%d)
# Директория для временных файлов
tmppath="TEMP_PATH"
# Куда складывать готовые видеофайлы
videopath="VIDEO_PATH"
#Задание имени готового видеофайла
mydate=$(date -d "${workdate}" +%Y-%m-%d)
filename=${cam}-${mydate}.avi
#База данных ZM
zmdatabase="ZM_BASE"
zmuser="ZM_USER"
zmpass="ZM_PASS"
#Говорим с чем работаем
echo workdate is ${mydate}
echo camera is ${cam}
#создание директорий
mkdir -p ${jpgpath}
mkdir -p ${videopath} 
# Выборка нужных файлов из базы данных с проверкой на ненулевой размер и копированием во временную директорию
monid=`mysql -u ${zmuser} --password=${zmpass} ${zmdatabase} -s -e "select Id from Monitors where Name='${cam}';" | awk '{print($1);}'`
evid=`mysql -u ${zmuser} --password=${zmpass} ${zmdatabase} -s -e "select Id from Events where MonitorId='${monid}' order by Id;" |awk '{print($1);}'`
i=10000
for n in ${evid}
do
  if [ -s ${evpath}/${diry}/${dirm}/${dird}/.${n}/Event-${n}-r1-s1.avi ]; then
    ln ${evpath}/${diry}/${dirm}/${dird}/.${n}/Event-${n}-r1-s1.avi ${tmppath}/${i}.avi
    i=$((i+1))
  fi
done
#удаление файла с таким же именем как у создаваемого
rm -f ${videopath}/${filename}
#кодирование видео из картинок
ffmpeg -an -i ${jpgpath}/%05d.avi -vcodec mpeg4 ${videopath}/${filename}
#удаление временных файлов
rm -rf ${tmppath}

Единственное что я не уверен, что правильно кормлю файлами ffmpeg...

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

liquidpredator

if [ «Z»$1 = «Z» ]; then

интересно, зачем такой изврат? можно же if [ -z «$1» ]; Кстати ваш изврат нерабочий - вторая кавычка не в том месте.

liquidpredator

ffmpeg -an -i ${jpgpath}/%05d.avi -vcodec mpeg4 ${videopath}/${filename}

liquidpredator

Единственное что я не уверен, что правильно кормлю файлами ffmpeg...

неправильно.

если вы хотите сделать маску «пять цифр, а потом .avi», то это записывается так [0-9][0-9][0-9][0-9][0-9].avi

Хотя я-бы извращался иначе: сначала попробывал-бы сразу доклеивать к фильму маленький кусочек _вместо_ ln, а если-бы не получилось, то сохранил-бы имя файла после ln

names="$names ${tmppath}/${i}.avi"

кормить можно было-бы так

ffmpeg -an -i $names -vcodec mpeg4 ${videopath}/${filename}

ЗЫЖ и да, зачем постоянно ${} писать? не лениво?

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

интересно, зачем такой изврат? можно же if [ -z «$1» ]; Кстати ваш изврат нерабочий - вторая кавычка не в том месте.

Рабочий, проверял :) изврат потому что не знал что можно if [-z «$1»];

ЗЫЖ и да, зачем постоянно ${} писать? не лениво?

Не знаю, привык так, да и не лениво :)

Хотя я-бы извращался иначе: сначала попробывал-бы сразу доклеивать к фильму маленький кусочек _вместо_ ln, а если-бы не получилось, то сохранил-бы имя файла после ln

Думается мне что много раз запускать ffmpeg хуже чем ln а потом один раз ffmpeg, но фиг знает, попробуем :)

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

liquidpredator

Рабочий, проверял :)

ху*во проверял - если в первом параметре скрипта пробелы, то скрипт рухнет с ошибкой.

liquidpredator

изврат потому что не знал что можно

man test поможет. Там много интересного. test это тоже самое, что и [, только для [ нужно ещё и ] ставить. А в целом test -s file.txt совершенно эквивалентно [ -s file.txt ] (хотя bash может подменить [ на свою внутреннюю команду, потому [ может быть намного быстрее. Впрочем здесь это не важно).

liquidpredator

да и не лениво :)

тогда без разницы.

liquidpredator

Думается мне что много раз запускать ffmpeg хуже чем ln

мне так совсем не думается. По скорости будет наверное примерно тоже самое, а вот заморочек будет в разы меньше.

drBatty ★★
()

Как уже сказали, в пределах одного тома комманда ln будет самая быстрая. Она просто создасть новое имя. При удалении старого имени файл не удалится.

sergijoo
()
Ответ на: комментарий от drBatty

if [ «Z»$1 = «Z» ]; then
интересно, зачем такой изврат?

Это олдскульная проверка на то что строка непустая.
Я такой вариант встречал по-моему даже в ABS гайде и всяких древних скриптах

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

man test поможет.

Спасибо!

мне так совсем не думается. По скорости будет наверное примерно тоже самое, а вот заморочек будет в разы меньше.

Возможно. Там тогда что нужно сделать? я так понял считываем с бд первый кусок, сращиваем его со вторым, дальше пишем имя результата в переменную и запускаем с начала но вместо первого куска ставим уже переменную?

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

Да, еще, все это крутится на CentOS 6.2 машинка Целка 2.5, 2Гб DDR2

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

Это олдскульная проверка на то что строка непустая.

Я такой вариант встречал по-моему даже в ABS гайде и всяких древних скриптах

ты внимательнее посмотри - в олдскульной проверке по другому.

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

Там тогда что нужно сделать? я так понял считываем с бд первый кусок, сращиваем его со вторым, дальше пишем имя результата в переменную и запускаем с начала но вместо первого куска ставим уже переменную?

создаём файл из первого куска, и далее в цикле сращиваем этот файл с 2, 3, 4, и т.д. кусками.

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

Я ещё помню extN с линейным поиском.

типа - дедушка? :-)

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

не работает, помойму из-за вызова ffmpeg... Выхлоп:


workdate is 2012-04-20
camera is Vhod
FFmpeg version 0.6.5, Copyright (c) 2000-2010 the FFmpeg developers
  built on Jan 29 2012 17:53:48 with gcc 4.4.5 20110214 (Red Hat 4.4.5-6)
  configuration: --prefix=/usr --libdir=/usr/lib --shlibdir=/usr/lib --mandir=/usr/share/man --incdir=/usr/include --disable-avisynth --extra-cflags='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i686 -mtune=atom -fasynchronous-unwind-tables' --enable-avfilter --enable-avfilter-lavf --enable-libdc1394 --enable-libdirac --enable-libfaac --enable-libfaad --enable-libfaadbin --enable-libgsm --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-librtmp --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libx264 --enable-gpl --enable-nonfree --enable-postproc --enable-pthreads --enable-shared --enable-swscale --enable-vdpau --enable-version3 --enable-x11grab
  libavutil     50.15. 1 / 50.15. 1
  libavcodec    52.72. 2 / 52.72. 2
  libavformat   52.64. 2 / 52.64. 2
  libavdevice   52. 2. 0 / 52. 2. 0
  libavfilter    1.19. 0 /  1.19. 0
  libswscale     0.11. 0 /  0.11. 0
  libpostproc   51. 2. 0 / 51. 2. 0
Input #0, avi, from '/video/temp/Vhod/10001.avi':
  Metadata:
    ISFT            : Lavf52.64.2
  Duration: 00:10:00.00, start: 0.000000, bitrate: 211 kb/s
    Stream #0.0: Video: mpeg4, yuv420p, 320x240 [PAR 1:1 DAR 4:3], 25 tbr, 25 tbn, 25 tbc
File '/video/temp/Vhod/10002.avi' already exists. Overwrite ? [y/N] n
Not overwriting - exiting

ffmpeg вызываю как:

ffmpeg -an -i ${tmppath}/1[0-9][0-9][0-9][0-9].avi -vcodec mpeg4 ${videopath}/${filename}
liquidpredator
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.