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


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Скрипт обхода папок - нужна помощь!  (Прочитано 5440 раз)

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

Оффлайн rerger

  • Автор темы
  • Новичок
  • *
  • Сообщений: 16
    • Просмотр профиля
Огромная просьба помочь со скриптом - переехал под Ubuntu не так давно, старательно осваиваю, но пласт такой, что пока не хватает времни и опыта, а сейчас решение нужно быстро.
Есть: сервер (железка) под Ubuntu 10.04 TLS, на нем два сервака - FTP и HTTP, соответсвенно две папки: FTP и www.
В  папку FTP пользователь может создать новую подпапку (для примера, "1") и положить произвольный многостраничный PDF - документ с названием "2.pdf".
Задача - нужен скрипт, который по крону (с кроном разобрался) раз в сутки будет обходить папку FTP, выяснять, есть ли новые папки с файлами (созданные за последние сутки), если да - заходить в новосозданную папку и превращать pdf в много png (постраничная нарезка, тут я знаю как делать, уже поставил imagemagick : "mkdir pages    magify -path pages -format pdf *.png")
Но: а что если в папке файла два или больше? можно ли как-то в цикле взять имена файлов и создать столько новых  папок, сколько файлов с именами, идентичными именам файлов(разумеется, без pdf)?
Далее все эти новые папки с нарезками нужно скопировать внутрь папки www

Возможно ли это и как? Читал маны, но на данный момент такое ощущение, что все буквы уже знакомы, а слово составить  не могу - не получается единый скрипт. Помогите если можете!
« Последнее редактирование: 12 Января 2011, 14:18:37 от rerger »

Оффлайн fisher74

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 13761
    • Просмотр профиля
Re: Гуру скриптинга - просьба о помощи!
« Ответ #1 : 11 Января 2011, 23:19:18 »
Как-то так можно сканировать все pdf и делать с ними что-то (прописные буквы в расширении не учитываются)
OUTDIR = /home/user/
for i in $( ls *.pdf ); do
mkdir $OUTDIR/pages.$i;
cp $i $OUTDIR/pages.$i/$i.bak;
done

Оффлайн censor

  • Старожил
  • *
  • Сообщений: 1126
    • Просмотр профиля
Re: Гуру скриптинга - просьба о помощи!
« Ответ #2 : 11 Января 2011, 23:20:24 »
самое примитивное что в голову пришло
for i in $(ls /var/ftp/ | grep -i pdf);
  do
  mkdir $(basename $i) magify -path pages -format pdf *.png;
  mkdir /var/www/$(basename $i);
  ln $(basename $i)/* /var/www/$(basename $i)/;
done;
« Последнее редактирование: 11 Января 2011, 23:25:05 от censor »

Оффлайн rerger

  • Автор темы
  • Новичок
  • *
  • Сообщений: 16
    • Просмотр профиля
Re: Гуру скриптинга - просьба о помощи!
« Ответ #3 : 11 Января 2011, 23:26:42 »
самое примитивное что в голову пришло
for i in $(ls /var/ftp/ | grep -i pdf);
  do
  mkdir $(basename $i) magify -path pages -format pdf *.png;
  mkdir /var/www/$(basename $i);
  ln $(basename $i)/* /var/www/$(basename $i)/;
done;

Спасибо большое!
Сейчас буду пробовать, выглядит понятно!

Пользователь решил продолжить мысль 11 Января 2011, 23:27:52:
Как-то так можно сканировать все pdf и делать с ними что-то (прописные буквы в расширении не учитываются)
OUTDIR = /home/user/
for i in $( ls *.pdf ); do
mkdir $OUTDIR/pages.$i;
cp $i $OUTDIR/pages.$i/$i.bak;
done

Спасибо огромное! Тут не все понятно, но тем интереснее, тоже попробую разобраться.

Оффлайн fisher74

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 13761
    • Просмотр профиля
Re: Гуру скриптинга - просьба о помощи!
« Ответ #4 : 11 Января 2011, 23:29:25 »
Цитировать
for i in $(ls /var/ftp/ | grep -i pdf);
Правильней и менее рамопожирательней будет
Цитировать
for i in $(ls /var/ftp/*.pdf);
но это не учитывает вложенные директории
Как костыль можно попробовать использовать
Цитировать
for i in $(ls /var/ftp/*/*.pdf);

Пользователь решил продолжить мысль 11 Января 2011, 23:35:25:
OUTDIR = /home/user/ - инициализируем переменную (для простоты использования)
for i in $( ls *.pdf ); do - организуем цикл for do используя в качестве переменной названия файлов в текущей директории с расширением .pdf
mkdir $OUTDIR/pages.$i; - создаём в директории OUTDIR субдиректорию с названием pages.file.pdf
cp $i $OUTDIR/pages.$i/$i.bak; -  тут собственно уже работа с файлом, cp  немного неправльно. лучше mv, а можн и сразу преобразовывать
done - закрываем цикл

Скрещивай предложенное и ваяй
« Последнее редактирование: 11 Января 2011, 23:35:25 от fisher74 »

Оффлайн censor

  • Старожил
  • *
  • Сообщений: 1126
    • Просмотр профиля
Re: Гуру скриптинга - просьба о помощи!
« Ответ #5 : 11 Января 2011, 23:51:20 »
ls *.pdf не учитывает верхний регистр
на сервере памяти мало или файлов много? если мало памти что что это за сервер для работы с графикой, если много файлов что стоит задуматься об их перемещении из обрабатываемого каталога.
ls -R /var/ftp | grep -i '.pdf' - рекурсивный обход каталогов если потребуется.

ну и изначально я же написал что первый же бред что в голову пришел.
« Последнее редактирование: 11 Января 2011, 23:53:03 от censor »

Оффлайн fisher74

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 13761
    • Просмотр профиля
Re: Гуру скриптинга - просьба о помощи!
« Ответ #6 : 11 Января 2011, 23:59:22 »
Ага, я тут вторым взглядом глянул и понял, что так файлы с пробелами в названии будут некорректно обрабатываться
for i in /var/ftp/*.pdf;А так корректно ;)

P.S. Всегда надо стремиться к чистоте кода, даже если это баш

Пользователь решил продолжить мысль 12 Января 2011, 00:08:33:
for i in /var/ftp/*.[pP][dD][fF];С учётом регистра.
Правда есть грабелька: при отсутствии файло в эти расширением переменной i присваивается значение /var/ftp/*.[pP][dD][fF] (именно в такм виде)
« Последнее редактирование: 12 Января 2011, 00:08:33 от fisher74 »

Оффлайн rerger

  • Автор темы
  • Новичок
  • *
  • Сообщений: 16
    • Просмотр профиля
Re: Гуру скриптинга - просьба о помощи!
« Ответ #7 : 12 Января 2011, 12:19:57 »
for i in /var/ftp/*.[pP][dD][fF];С учётом регистра.
Правда есть грабелька: при отсутствии файло в эти расширением переменной i присваивается значение /var/ftp/*.[pP][dD][fF] (именно в такм виде)

mkdir $OUTDIR/pages.$i;
Пробую делать и вот на что наткнулся - $i содержит не имя файла, а полный путь - естественно, mkdir не может создать требуемую папку, использовал $(basename $i) из другого примера. :)
А можно в $(basename $i) .pdf как-то отрезать?
« Последнее редактирование: 12 Января 2011, 12:24:56 от rerger »

Оффлайн Дмитрий Бо

  • Погонщик серверов
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 3549
  • Я не техподдержка, я за порядком слежу
    • Просмотр профиля
Re: Гуру скриптинга - просьба о помощи!
« Ответ #8 : 12 Января 2011, 13:45:04 »
ТС, поменяй название топика, нарушаешь 2.4

По вопросу
awk, sed
sed s/"\.pdf"//

Оффлайн rerger

  • Автор темы
  • Новичок
  • *
  • Сообщений: 16
    • Просмотр профиля
Re: Гуру скриптинга - просьба о помощи!
« Ответ #9 : 12 Января 2011, 14:17:38 »
Ну вообще, в теме указано, что вопрос по скриптингу, так что это не просто "Помогите!".
Но... модератор всегда прав.. :)

И спасибо за ответ!

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: Скрипт обхода папок - нужна помощь!
« Ответ #10 : 12 Января 2011, 14:55:13 »
man find
find $FTP -name "*.pdf" -mtime 1 -exec скрипт_или_команда_нарезки_на_png '{}' \;

Цитировать
А можно в $(basename $i) .pdf как-то отрезать?

Можно, basename понимает второй аргумент, в котором сказано, что отрезать с конца и выкинуть.
`basename $i .pdf`
или
$(basename $i .pdf)

« Последнее редактирование: 12 Января 2011, 15:12:10 от wl »
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн dimas000

  • Старожил
  • *
  • Сообщений: 1437
  • Ubuntu 9.10 @ 2.6.34
    • Просмотр профиля
Re: Скрипт обхода папок - нужна помощь!
« Ответ #11 : 12 Января 2011, 15:22:19 »
#/bin/bash
find /var/ftp/ -iname "*.pdf" -type f -mtime 1 | while read fl ; do
# рекусрсивно ищем в /var/ftp файлы *.pdf, измененные за последние 24 часа
path=$(dirname "$fl") # путь к файлу
name=$(basename "$fl" .pdf) # имя файла без ресширения
mkdir "$path/$name" # созаем папку под нарезку
magify /что /куда -как # тут уж сам сообразишь
rm $fl # удаляем исходную пдф-ку, если надо
ln -sf "$path/$name" "/var/www/$name" # линкуем папку с нарезкой в /var/www/имя
done # while read ....
вот, пробуй. вроде, понятно разжевал)))
« Последнее редактирование: 12 Января 2011, 18:48:13 от dimas000 »
лучше на "ты"

Оффлайн rerger

  • Автор темы
  • Новичок
  • *
  • Сообщений: 16
    • Просмотр профиля
Re: Скрипт обхода папок - нужна помощь!
« Ответ #12 : 12 Января 2011, 17:01:40 »
#/bin/bash
find /var/ftp/ -iname "*.pdf" -type f -mtime 1 | while read $fl ; do
# рекусрсивно ищем в /var/ftp файлы *.pdf, измененные за последние 24 часа
path=$(dirname "$fl") # путь к файлу
name=$(basename "$fl" .pdf) # имя файла без ресширения
mkdir "$path/$name" # созаем папку под нарезку
magify /что /куда -как # тут уж сам сообразишь
rm $fl # удаляем исходную пдф-ку, если надо
ln -sf "$path/$name" "/var/www/$name" # линкуем папку с нарезкой в /var/www/имя
done # while read ....
вот, пробуй. вроде, понятно разжевал)))

Вау, круть! Спасибо большое!!

Оффлайн dimas000

  • Старожил
  • *
  • Сообщений: 1437
  • Ubuntu 9.10 @ 2.6.34
    • Просмотр профиля
Re: Скрипт обхода папок - нужна помощь!
« Ответ #13 : 12 Января 2011, 18:47:51 »
Цитировать
while read $fl
while read fl
лучше на "ты"

 

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