Просмотр полной версии : Хитрые способы архивирования
Haszser777
16.10.2007, 12:18
Стала следующая задача - перенести файлы юзеров(домашние папки) с одного сервера на другой. Во время первых попыток копирования убедился как это муторно и нудно(другой сервак находиться в Инете(Co-location), убедился сколько хлама валяется в каталогах юзеров, на просьбы "почистить" тупые юзеры не реагируют, решил облегчить задачу им следующим способом:
Дабы юзер узрел сколько у него хлама(всякие архивы, фотки и прочая лабуда, которая иногда бывает все же для него нужной)в его каталоге создаются специальные каталоги в которых находяться символьные ссылки на весь его хлам, причем в следующей структуре(этакий глобальный фильтр):
1 - каталог с доками(*.doc, *.odt и прочее)
2 - каталог с картинками(*.jpeg и прочее)
3 - каталог с архивами
и т.д.
причем в каждом каталоге будет воссоздана вся структура его домашнего каталога(дабы он потом не орал, что я попортил всю его классную иерархию) но в каталоге будут находиться только те файлы которые я укажу. Соответственно после того как юзер зайдет в эти каталоги, удалит все ненужные файлы в каждом каталоге, эти каталоги запаковываются tarом и отправляются по ftp на сервер.
Теперь вопрос: как запаковывать симлинки в номальные файлы я нашел, осталось узнать как заставить например команду cp пройтись по всем каталогам пользователя рекурсивно и скопировать файлы в каталог(с сохранением путей и структуры) по заданному мной шаблону.
Если есть способы решения сей задачки подскажите что-нибудь...
Ingreedd
16.10.2007, 12:28
ссылка первая: man cp :)
cp -R, кажется, умеет все делать рекурсивно.
Haszser777
16.10.2007, 12:33
cp -R -делает копиривание каталогов... а не файлов,
то есть если написать cp -R /home/user/1/*.jpg /home/user/2
то он скопирует файлы по шаблону только из каталога 1, рекурсивно он их не обрабатывает, сейчас ковыряюсь с find, может с ним что получится
Sir Arthur
16.10.2007, 12:36
-a, --archive same as -dpPR
--backup[=CONTROL] make a backup of each existing destination file
-b like --backup but does not accept an argument
--copy-contents copy contents of special files when recursive
-d same as --no-dereference --preserve=link
-f, --force if an existing destination file cannot be
opened, remove it and try again
-i, --interactive prompt before overwrite
-H follow command-line symbolic links
-l, --link link files instead of copying
-L, --dereference always follow symbolic links
-P, --no-dereference never follow symbolic links
-p same as --preserve=mode,ownership,timestamps
--preserve[=ATTR_LIST] preserve the specified attributes (default:
mode,ownership,timestamps), if possible
additional attributes: links, all
--no-preserve=ATTR_LIST don't preserve the specified attributes
--parents use full source file name under DIRECTORY
-R, -r, --recursive copy directories recursively
--remove-destination remove each existing destination file before
attempting to open it (contrast with --force)
--sparse=WHEN control creation of sparse files
--strip-trailing-slashes remove any trailing slashes from each SOURCE
argument
-s, --symbolic-link make symbolic links instead of copying
-S, --suffix=SUFFIX override the usual backup suffix
-t, --target-directory=DIRECTORY copy all SOURCE arguments into DIRECTORY
-T, --no-target-directory treat DEST as a normal file
-u, --update copy only when the SOURCE file is newer
than the destination file or when the
destination file is missing
-v, --verbose explain what is being done
-x, --one-file-system stay on this file system
--attributes=regex preserve extended attributes whose name
matches the specified regular expression
(defaults to preserving all extended
attributes except file permissions;
regex=`-' preserves no extended attributes).
cp -aR -копирует рекурсивно с сохранением прав на файлы
Haszser777
16.10.2007, 12:53
я пробую вот такую команду
cp -asR /home/user/Documents._/*.jpg /home/user/demo/
и он копирует только файлы из каталога Documents._ в подкаталоги он не заходит...
Sir Arthur
16.10.2007, 13:00
если не указывать *.jpg то же самое?
т.е
cp -asR /home/user/Documents._/ /home/user/demo/
Haszser777
16.10.2007, 13:10
нет, так он конечно же работает, но в том то и дело, что мне не нужны все файлы, мне нужны только *.jpg(то бишь файлы с картинками) и нужно их скопировать со всех подкаталогов...
Sir Arthur
16.10.2007, 13:15
эм.. а ежли так:
1. копируем ркурсивно. создаем симлинку
2. в копии убиваем все что не надо?
Haszser777
16.10.2007, 13:28
в том и дело, что я хочу разложить все файлы юзеров по папочкам, ибо когда они просто так просматривают свои каталоги говорят: "О это нужный каталог, там что-то есть", а когда ему покажут что там кроме нужного ему 20Кб файлика лежат 2 архива по 10 метров и фотки с предыдущего нового года он вдруг начинает кричать - "да мочи ты эту лабуду, она нафиг не нужна..." думал просто взять и завалить все картинки, так нет, оказывается что очень часто присылают счета в формате .jpg ну и т.д.
Haszser777
16.10.2007, 13:33
Сейчас никак не могу отыскать работающих примеров команды find(вроде она когда находит файл может выполнять команду)
пишу find /home/user -iname *.jpg ищет, а вот как заставить его искать сразу несколько шаблонов? пробовал и так:
find /home/user -iname *.jpg *.cdr
find /home/user -iname *.jpg -iname *.cdr
find /home/user -iname *.jpg or -iname *.cdr
find /home/user -iname '*.jpg' '*.cdr'
на все попытки - посылает лесом, короче ковыряюсь в поисках примера в инете...
Haszser777
16.10.2007, 14:39
С find разобрался... нужно было просто написать параметр -o
то бишь(для тех кому это может понадобиться)
пишется так find /home/user -name "*.cdr" -o -name "*.jpg"
если писать без -o то все ключи воспринимаются как И, с опцией -o как ИЛИ
Haszser777
16.10.2007, 15:24
Вот такая командочка получилась в итоге:
find $1/ \! -path "*/.*" -a \( -name "*.gif" -o -name "*.bmp" -o -name "*.tif" -o -name "*.tiff" -o -name "*.jpeg" -o -name "*.cdr" -o -name "*.jpg" \) -exec cp -s --parents {} $1/Pack_2_pic \;
кстати если у кого есть работающий пример с regexом запостите(ибо что-то у меня он отчаянно ругается на синтаксис)
Haszser777
16.10.2007, 17:19
Если кому нужно Скрипт сортировки(очень корявый ибо по ключу "-regex" я толковых примеров так и не нашел
cat ./sort_home_dir
#!/bin/bash
#Скрипт для сортировки каталогов юзеров
#512 - это группа по умолчанию
Fdir1="$1"Fdir_1_doc
Fdir2="$1"Fdir_2_pic
Fdir3="$1"Fdir_3_pdf
Fdir4="$1"Fdir_4_web
Fdir5="$1"Fdir_5_zip
Fdir6="$1"Fdir_other
#Ignore='\! -path "*/.*" -a \! -path "*/Fdir*"'
#echo $Ignore
echo "Находим и делаем линки для документов..."
mkdir -p $Fdir1
find $1 \! -path "*/.*" -a \! -path "*/Fdir*" -a \( -iname "*.doc" -o -iname "*.odt" -o -iname "*.xls" -o -iname "*.ods" -o -iname "*.rtf" -o -iname "*.txt" -o -iname "*.ppt" \) -exec cp -s --parents {} $Fdir1 \;
chown -R $2:512 $Fdir1
echo "Находим и делаем линки для картинок..."
mkdir -p $Fdir2
find $1 \! -path "*/.*" -a \! -path "*/Fdir*" -a \( -iname "*.gif" -o -iname "*.fla" -o -iname "*.swf" -o -iname "*.bmp" -o -iname "*.tif" -o -iname "*.tiff" -o -iname "*.jpeg" -o -iname "*.cdr" -o -iname "*.jpg" \) -exec cp -s --parents {} $Fdir2 \;
chown -R $2:512 $Fdir2
echo "Находим и делаем линки для pdf..."
mkdir -p $Fdir3
find $1 \! -path "*/.*" -a \! -path "*/Fdir*" -a -iname "*.pdf" -exec cp -s --parents {} $Fdir3 \;
chown -R $2:512 $Fdir3
echo "Находим и делаем линки для web-страниц..."
mkdir -p $Fdir4
find $1 \! -path "*/.*" -a \! -path "*/Fdir*" -a \( -iname "*.htm" -o -iname "*.html" \) -exec cp -s --parents {} $Fdir4 \;
chown -R $2:512 $Fdir4
echo "Находим и делаем линки для архивов..."
mkdir -p $Fdir5
find $1 \! -path "*/.*" -a \! -path "*/Fdir*" -a \( -iname "*.zip" -o -iname "*.rar" -o -iname "*.gz" -o -iname "*.bz" \) -exec cp -s --parents {} $Fdir5 \;
chown -R $2:512 $Fdir5
echo "Находим и делаем линки для прочего хлама..."
mkdir -p $Fdir6
find $1 -type f -a \! -path "*/.*" -a \! -path "*/Fdir*" -a \! -iname "*.gif" -a \! -iname "*.fla" -a \! -iname "*.swf" -a \! -iname "*.bmp" -a \! -iname "*.tif" -a \! -iname "*.tiff" -a \! -iname "*.jpeg" -a \! -iname "*.cdr" -a \! -iname "*.jpg" -a \! -iname "*.doc" -a \! -iname "*.odt" -a \! -iname "*.odx" -a \! -iname "*.xls" -a \! -iname "*.txt" -a \! -iname "*.ppt" -a \! -iname "*.rtf" -a \! -iname "*.zip" -a \! -iname "*.rar" -a \! -iname "*.bz" -a \! -iname "*.gz" -a \! -iname "*.pdf" -a \! -iname "*.htm" -a \! -iname "*.html" -a \! -iname "*.ods" -exec cp -s --parents {} $Fdir6 \;
chown -R $2:512 $Fdir6
скрипт упаковки полученного
cat ./pack_home_dir
#!/bin/bash
#Скрипт для упаковки каталогов юзеров
Fdir1="$1"Fdir_1_doc
Fdir2="$1"Fdir_2_pic
Fdir3="$1"Fdir_3_pdf
Fdir4="$1"Fdir_4_web
Fdir5="$1"Fdir_5_zip
Fdir6="$1"Fdir_other
echo "Обрабатываем каталог $1"
echo "Пакуем каталог $Fdir1..."
cd $Fdir1 && tar -czhf "$1"pack_fdir_1.tar.gz *
echo "Пакуем каталог $Fdir2..."
cd $Fdir2 && tar -czhf "$1"pack_fdir_2.tar.gz *
echo "Пакуем каталог $Fdir3..."
cd $Fdir3 && tar -czhf "$1"pack_fdir_3.tar.gz *
echo "Пакуем каталог $Fdir4..."
cd $Fdir4 && tar -czhf "$1"pack_fdir_4.tar.gz *
echo "Пакуем каталог $Fdir5..."
cd $Fdir5 && tar -czhf "$1"pack_fdir_5.tar.gz *
echo "Пакуем каталог $Fdir6..."
cd $Fdir6 && tar -czhf "$1"pack_fdir_6.tar.gz *
shurutov
16.10.2007, 18:20
mshurutov@shurutov tmp $ find . -regextype posix-egrep -iregex ".*jpg|.*pdf"
./download/avatara.jpg
./download/postfix_radius_auth.pdf
./download/Image(137).jpg
./download/Image(145).jpg
./download/putty_users_guide.pdf
./download/Image(144).jpg
./download/Image(139).jpg
./download/Image(146).jpg
./download/Image(138).jpg
./download/Image(147).jpg
./sysmngt.pdf
Haszser777
17.10.2007, 14:30
:agree: спасибо за работающий пример, теперь я смогу сделать скрипт более человеческим...
shurutov
17.10.2007, 15:55
Вообще по поводу регулярных выражений я настоятельно рекомендую иметь в библиотеке и проштудировать книгу Дж. Фридла "Регулярные выражения" - более полного описания работы этого инструмента, причем с учетом различных диалектов, а также описания нюансов я не встречал.
vBulletin® v3.8.0, Copyright ©2000-2012, Jelsoft Enterprises Ltd. Перевод: zCarot